Jawaban:
Apa yang lebih baik, seekor ikan atau sepeda? nohup
dan exec
melakukan berbagai hal.
exec
mengganti shell dengan program lain. Menggunakan exec
dalam pekerjaan latar belakang yang sederhana tidak berguna: exec myprogram; more stuff
mengganti shell dengan myprogram
dan tidak berjalan more stuff
, tidak seperti myprogram; more stuff
yang berjalan more stuff
ketika myprogram
berakhir; tetapi exec myprogram & more stuff
dimulai myprogram
di latar belakang dan kemudian berjalan more stuff
, sama seperti myprogram & more stuff
.
nohup
menjalankan 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 nohup
mencegahnya 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).
nohup
juga mengalihkan keluaran program ke file nohup.out
. Ini menghindari program sekarat karena tidak dapat menulis ke outputnya atau output kesalahan. Catatan yang nohup
tidak 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 exec
sebagai 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, firefox
proses 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.
exec
Proses meninggal ketika SIGHUP
diterima, tapi nohup
proses terus.
exec
menggantikan 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 nohup
dengan exec
. Ketika Anda menjalankan executable dengan nohup
, proses tidak akan mati ketika Anda logout (sesi ssh); biasanya nohup
digunakan dengan nice
menjalankan proses pada prioritas yang lebih rendah. The HUP
sinyal, dengan konvensi, cara terminal memperingatkan proses tergantung dari logout