disown
menyebabkan shell tidak mengirim SIGHUP ke pekerjaan yang tidak diakui saat shell berakhir, dan
menghapus pekerjaan yang tidak diakui dari kontrol pekerjaan shell.
Apakah yang pertama adalah hasil dari yang kedua? Dengan kata lain, jika suatu proses dimulai dari shell dihapus dari kontrol pekerjaan shell dengan cara apa pun, akankah shell tidak mengirim SIGHUP ke proses ketika shell berakhir?
disown -h
masih menyimpan proses di bawah kendali pekerjaan shell. Apakah itu berarti bahwa disown -h
membuat suatu proses masih menerima SIGHUP yang dikirim dari shell, tetapi mengatur aksi SIGHUP dengan proses untuk "diabaikan"? Kedengarannya mirip nohup
.
$ sleep 123 & disown -h
[1] 26103
$ jobs
[1]+ Running sleep 123 &
$ fg 1
sleep 123
$ ^Z
[1]+ Stopped sleep 125
$ bg 1
[1]+ sleep 123 &
$ exit
$ ps aux | grep sleep
t 26103 0.0 0.0 14584 824 ? S 15:19 0:00 sleep 123
Apakah disown -h
dan nohup
bekerja secara efektif sama, jika kita mengabaikan perbedaan mereka dalam menggunakan terminal?
Terima kasih.
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
).Jawaban:
nohup
dandisown -h
bukan hal yang persis sama.Dengan
disown
, suatu proses dihapus dari daftar pekerjaan di shell interaktif saat ini. Berjalanjobs
setelah memulai proses latar belakang dan menjalankandisown
tidak akan menunjukkan proses itu sebagai pekerjaan di shell. Pekerjaan yang tidak diakui tidak akan menerimaHUP
dari shell saat keluar (tetapi lihat catatan di bagian akhir).Dengan
disown -h
, pekerjaan tidak dihapus dari daftar pekerjaan, tetapi shell tidak akan mengirimHUP
sinyal kepadanya jika keluar (tapi lihat catatan di akhir).The
nohup
utilitas mengabaikanHUP
sinyal dan mulai utilitas yang diberikan. Utilitas mewarisi topeng sinyal darinohup
dan karena itu juga akan mengabaikanHUP
sinyal. Ketika shell berakhir, proses itu tetap sebagai proses anak darinohup
(dan dinohup
-parentinit
).Perbedaannya adalah bahwa proses dimulai dengan
nohup
mengabaikanHUP
terlepas dari siapa yang mengirim sinyal. Proses diakui hanya tidak dikirim sebuahHUP
sinyal oleh shell , tapi mungkin masih akan dikirim sinyal dari misalnyakill -s HUP <pid>
dan tidak akan mengabaikan hal ini.Perhatikan bahwa
HUP
hanya dikirim ke pekerjaan shell jikahuponexit
opsi shell diatur, atauHUP
sinyal.Bit yang relevan dari
bash
manual (penekanan saya):Terkait:
sumber
bash: disown: nohup: no such job
dan sama untuksleep
dan5
daridisown nohup sleep 5 &
. Apa yang Anda maksud dengan perintah kedua dari kalimat terakhir?&
di sana (dan urutannohup
dandisown
juga salah). Terima kasih. Akan diperbarui sekarang.disown
membuat shell tidak mengirim SIGHUP ke anak dengan mengeluarkan anak dari daftar pekerjaan shell. Bagaimanadisown -h
mencapai hal yang sama?Mereka berbeda:
Disown menghapus pekerjaan dari tabel pekerjaan aktif. Kemudian dilanjutkan dengan pekerjaan saat ini. Dengan -h proses TIDAK dikirim SIGHUP. Alih-alih dibiarkan mati dengan shell yang berisi itu, ketika menerima SIGHUP.
nohup mengabaikan HUP. Maka segala sesuatu yang akan diteruskan ke terminal oleh penutupan proses bukannya pergi ke file
nohup.out
.sumber