nohup
dan disown -h
bukan hal yang persis sama.
Dengan disown
, suatu proses dihapus dari daftar pekerjaan di shell interaktif saat ini. Berjalan jobs
setelah memulai proses latar belakang dan menjalankan disown
tidak akan menunjukkan proses itu sebagai pekerjaan di shell. Pekerjaan yang tidak diakui tidak akan menerima HUP
dari shell saat keluar (tetapi lihat catatan di bagian akhir).
Dengan disown -h
, pekerjaan tidak dihapus dari daftar pekerjaan, tetapi shell tidak akan mengirim HUP
sinyal kepadanya jika keluar (tapi lihat catatan di akhir).
The nohup
utilitas mengabaikan HUP
sinyal dan mulai utilitas yang diberikan. Utilitas mewarisi topeng sinyal dari nohup
dan karena itu juga akan mengabaikan HUP
sinyal. Ketika shell berakhir, proses itu tetap sebagai proses anak dari nohup
(dan di nohup
-parent init
).
Perbedaannya adalah bahwa proses dimulai dengan nohup
mengabaikan HUP
terlepas dari siapa yang mengirim sinyal. Proses diakui hanya tidak dikirim sebuah HUP
sinyal oleh shell , tapi mungkin masih akan dikirim sinyal dari misalnya kill -s HUP <pid>
dan tidak akan mengabaikan hal ini.
Perhatikan bahwa HUP
hanya dikirim ke pekerjaan shell jika
- shell adalah shell login dan
huponexit
opsi shell diatur, atau
- shell itu sendiri menerima
HUP
sinyal.
Bit yang relevan dari bash
manual (penekanan saya):
SINYAL
[...]
Shell keluar secara default setelah menerima aSIGHUP
. Sebelum keluar, shell interaktif mengirim ulang SIGHUP
ke semua pekerjaan, berjalan atau berhenti. Pekerjaan yang dihentikan dikirim SIGCONT
untuk memastikan bahwa mereka menerima
SIGHUP
. Untuk mencegah shell mengirim sinyal ke pekerjaan tertentu, itu harus dihapus dari tabel pekerjaan dengan disown
builtin (lihat di SHELL BUILTIN COMMANDS
bawah) atau ditandai untuk tidak menerima SIGHUP
penggunaan disown -h
.
Jika huponexit
opsi shell telah diatur dengan shopt
, bash
kirim a
SIGHUP
ke semua pekerjaan saat shell login interaktif keluar.
disown [-ar] [-h] [jobspec ... | pid ... ]
Tanpa opsi, hapus masing-masing jobspec
dari tabel pekerjaan aktif. [...] Jika -h
opsi ini diberikan, masing jobspec
- masing tidak dihapus dari tabel, tetapi ditandai sehingga SIGHUP
tidak 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
).