Mengapa menggunakan "nohup &" daripada "exec &"

67

Saya tahu bahwa, nohupsebagai biner, dapat dicapai dari shell apa pun. Tapi execbuilt-in mungkin ada di setiap shell.

Apakah ada alasan untuk memilih salah satu dari mereka, yang lain?

loxaxs
sumber

Jawaban:

113

Apa yang lebih baik, seekor ikan atau sepeda? nohupdan execmelakukan berbagai hal.

execmengganti shell dengan program lain. Menggunakan execdalam pekerjaan latar belakang yang sederhana tidak berguna: exec myprogram; more stuffmengganti shell dengan myprogramdan tidak berjalan more stuff, tidak seperti myprogram; more stuffyang berjalan more stuffketika myprogramberakhir; tetapi exec myprogram & more stuffdimulai myprogramdi latar belakang dan kemudian berjalan more stuff, sama seperti myprogram & more stuff.

nohupmenjalankan program khusus dengan sinyal SIGHUP diabaikan. Ketika terminal ditutup, kernel mengirimkan SIGHUP ke proses kontrol di terminal itu (yaitu shell). Shell pada gilirannya mengirimkan SIGHUP ke semua pekerjaan yang berjalan di latar belakang. Menjalankan pekerjaan dengan nohupmencegahnya terbunuh dengan cara ini jika terminal mati (yang terjadi misalnya jika Anda login jarak jauh dan koneksi turun, atau jika Anda menutup emulator terminal Anda).

nohupjuga mengalihkan keluaran program ke file nohup.out. Ini menghindari program sekarat karena tidak dapat menulis ke outputnya atau output kesalahan. Catatan yang nohuptidak mengarahkan input. Untuk memutus sepenuhnya program dari terminal tempat Anda meluncurkannya, gunakan

nohup myprogram </dev/null >myprogram.log 2>&1 &
Gilles 'SANGAT berhenti menjadi jahat'
sumber
27
sepeda> seekor ikan
Chris Jaynes
6
Saya mohon untuk berbeda. Ikan jelas merupakan metode transportasi yang unggul jika dapat diterapkan.
PENGGUNA INI MEMBUTUHKAN BANTUAN
6
@ THISUSERNEEDSHELP Tapi sepeda adalah makanan yang lebih baik, tentunya?
Gilles 'SANGAT berhenti menjadi jahat'
3
@ GypsyCosmonaut Setelah Anda menjalankan exec firefox, shell tidak lagi berjalan: sudah diganti oleh firefox. Anda dapat menganggap execsebagai menggabungkan keluar dari program dan memulai yang baru, tetapi menjaga ID proses yang sama. The terminal terus berjalan karena tidak ada diberitahu untuk berhenti. Ketika nanti Anda keluar dari Firefox, firefoxproses berakhir. Terminal memperhatikan bahwa proses anaknya telah keluar sehingga keluar secara bergantian.
Gilles 'SO- stop being evil'
5
Berikan seorang pria ikan dan Anda memberinya makan selama sehari. Berikan seorang pria sepeda dan dia bisa naik ke supermarket dan membeli ikan seumur hidup.
David
18

exec & => mengeksekusi proses sebagai proses latar belakang sehingga Anda dapat terus menggunakan terminal yang sama untuk pekerjaan lain.

nohup => menghindari semua SIGHUP (mengakhiri sinyal) dan melanjutkan eksekusi bahkan jika terminal Anda ditutup.

execProses meninggal ketika SIGHUPditerima, tapi nohupproses terus.

Ani Menon
sumber
1
Jawaban ini tampaknya benar. Seperti jawaban lain di atas katakan, biasanya execmenggantikan proses yang berjalan, tetapi itu tampaknya tidak terjadi ketika Anda menggunakan &untuk latar belakang perintah exec. Baik dalam bash maupun zsh.
Dan Pritts
@DanPritts Apa maksudmu dengan itu tidak terjadi? Subproses latar belakang dimulai dan kemudian diganti, jadi exec smth &sama dengan (exec smth) &, bukankah itu yang terjadi?
phk
1
Maksud saya itu tidak bisa dieksekusi dalam arti bahwa Anda biasanya memikirkan (mengganti shell yang sedang berjalan) - itu hanya dijalankan sebagai proses latar belakang. Saya kira itu mungkin sama dengan (exec smth) &. Tapi saya tidak akan mengharapkan itu menjadi sama - saya akan mengharapkan itu menjadi kesalahan sintaks, bagaimana Anda bisa menjalankan suatu proses (mengganti diri Anda) dan kemudian latar belakang proses eksekutif itu? Anda tidak ada di sana untuk melakukannya lagi.
Dan Pritts
2

Perintah built in shell exec <command>menggantikan shell dengan <command>, tanpa proses baru, tidak ada PID baru yang dibuat. Setelah selesai <command>biasanya terminal Anda akan ditutup. Dengan menjalankannya di latar belakang pertama sebuah subkulit dibuat, yang kemudian segera diganti oleh <command>.

The nohup <command> perintah akan dijalankan <command>tapi immume ke hangups (membunuh -s 1) sehingga tidak akan dihentikan ketika shell, terminal dari mana itu dimulai adalah, ditutup. Dengan menjalankannya di latar belakang pertama sebuah subkulit dibuat dan perintah berjalan di latar belakang, mengembalikan Anda ke prompt.

Dalam skrip, efek langsungnya kurang lebih sama, <command>dimulai oleh skrip Anda dan skrip akan berlanjut tanpa menunggu untuk <command>memulai, untuk mengirim output atau untuk menyelesaikan.

HBruijn
sumber
Saya juga tidak yakin tentang apa yang eksekutif lakukan. Maksud saya ... saya mengerti apa yang seharusnya dilakukan tetapi saya hanya bisa melihat perbedaan kecil antara melakukan script.sh &atau exec script.sh &. Dalam kedua kasus, perintah dieksekusi dalam proses anak, itu tidak menggantikan proses panggilan, lihat: paste.alacon.org/44474 (terlalu lama untuk menyalinnya di sini dalam komentar ...). Apa yang saya lakukan salah?
Stéphane
2

Anda tidak dapat membandingkan nohupdengan exec. Ketika Anda menjalankan executable dengan nohup, proses tidak akan mati ketika Anda logout (sesi ssh); biasanya nohupdigunakan dengan nicemenjalankan proses pada prioritas yang lebih rendah. The HUPsinyal, dengan konvensi, cara terminal memperingatkan proses tergantung dari logout

pengguna2660420
sumber