nohupdan disown -hbukan hal yang persis sama.
Dengan disown, suatu proses dihapus dari daftar pekerjaan di shell interaktif saat ini. Berjalan jobssetelah memulai proses latar belakang dan menjalankan disowntidak akan menunjukkan proses itu sebagai pekerjaan di shell. Pekerjaan yang tidak diakui tidak akan menerima HUPdari shell saat keluar (tetapi lihat catatan di bagian akhir).
Dengan disown -h, pekerjaan tidak dihapus dari daftar pekerjaan, tetapi shell tidak akan mengirim HUPsinyal kepadanya jika keluar (tapi lihat catatan di akhir).
The nohuputilitas mengabaikan HUPsinyal dan mulai utilitas yang diberikan. Utilitas mewarisi topeng sinyal dari nohupdan karena itu juga akan mengabaikan HUPsinyal. Ketika shell berakhir, proses itu tetap sebagai proses anak dari nohup(dan di nohup-parent init).
Perbedaannya adalah bahwa proses dimulai dengan nohupmengabaikan HUPterlepas dari siapa yang mengirim sinyal. Proses diakui hanya tidak dikirim sebuah HUPsinyal oleh shell , tapi mungkin masih akan dikirim sinyal dari misalnya kill -s HUP <pid>dan tidak akan mengabaikan hal ini.
Perhatikan bahwa HUPhanya dikirim ke pekerjaan shell jika
- shell adalah shell login dan
huponexitopsi shell diatur, atau
- shell itu sendiri menerima
HUPsinyal.
Bit yang relevan dari bashmanual (penekanan saya):
SINYAL
[...]
Shell keluar secara default setelah menerima aSIGHUP . Sebelum keluar, shell interaktif mengirim ulang SIGHUPke semua pekerjaan, berjalan atau berhenti. Pekerjaan yang dihentikan dikirim SIGCONTuntuk memastikan bahwa mereka menerima
SIGHUP. Untuk mencegah shell mengirim sinyal ke pekerjaan tertentu, itu harus dihapus dari tabel pekerjaan dengan disownbuiltin (lihat di SHELL BUILTIN COMMANDSbawah) atau ditandai untuk tidak menerima SIGHUP
penggunaan disown -h.
Jika huponexitopsi shell telah diatur dengan shopt, bashkirim a
SIGHUPke semua pekerjaan saat shell login interaktif keluar.
disown [-ar] [-h] [jobspec ... | pid ... ]
Tanpa opsi, hapus masing-masing jobspecdari tabel pekerjaan aktif. [...] Jika -hopsi ini diberikan, masing jobspec- masing tidak dihapus dari tabel, tetapi ditandai sehingga SIGHUPtidak dikirim ke pekerjaan jika shell menerima aSIGHUP . [...]
Terkait:
nohup, Anda perlu mengarahkan stdin / stdout / stderr menjauh dari TTY (jika shell asli Anda terhubung ke satu) sendiri. (OTOH, saya benar-benar menganggap bahwa praktik yang lebih baik daripada mengandalkan standar hardcode mengerikan seperti./nohup.out).