Jawaban:
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 &
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.
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.
execmenggantikan proses yang berjalan, tetapi itu tampaknya tidak terjadi ketika Anda menggunakan &untuk latar belakang perintah exec. Baik dalam bash maupun zsh.
exec smth &sama dengan (exec smth) &, bukankah itu yang terjadi?
(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.
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.
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?
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