Ini adalah tindak lanjut dari pertanyaan ini .
Saya sudah menjalankan beberapa tes lagi; sepertinya itu benar-benar tidak masalah jika ini dilakukan di konsol fisik atau melalui SSH, juga tidak terjadi hanya dengan SCP; Saya juga mengujinya dengan cat /dev/zero > /dev/null
. Perilaku ini persis sama:
- Mulai proses di latar belakang menggunakan
&
(atau letakkan di latar belakang setelah mulai menggunakanCTRL-Z
danbg
); ini dilakukan tanpa menggunakannohup
. - Keluar.
- Logon lagi.
- Prosesnya masih ada, berjalan dengan gembira, dan sekarang adalah anak langsung dari
init
.
Saya dapat mengkonfirmasi SCP dan CAT segera berhenti jika mengirim SIGHUP
; Saya menguji ini menggunakan kill -HUP
.
Jadi, sepertinya SIGHUP tidak dikirim saat keluar, setidaknya untuk proses latar belakang (tidak dapat menguji dengan latar depan karena alasan yang jelas).
Ini terjadi pada saya pada awalnya dengan konsol layanan VMware ESX 3.5 (yang didasarkan pada RedHat), tetapi saya dapat meniru persis pada CentOS 5.4.
Pertanyaannya adalah, sekali lagi: bukankah SIGHUP harus dikirim ke proses, bahkan jika itu berjalan di latar belakang, setelah log off? Mengapa ini tidak terjadi?
Edit
Aku mengeceknya strace
, sesuai jawaban Kyle.
Seperti yang saya harapkan, proses tidak mendapatkan sinyal apa pun ketika keluar dari shell tempat diluncurkan. Ini terjadi saat menggunakan konsol server dan melalui SSH.
--- SIGHUP {si_signo=SIGHUP, si_code=SI_USER, si_pid=10676, si_uid=3000090} --- rt_sigreturn() = -1 EINTR (Interrupted system call) rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
--- SIGHUP {si_signo=SIGHUP, si_code=SI_USER, si_pid=13944, si_uid=3000090} --- +++ killed by SIGHUP +++
huponexit
.Jawaban:
Jawaban ditemukan.
Untuk BASH, ini tergantung pada
huponexit
opsi shell, yang dapat dilihat dan / atau diatur menggunakanshopt
perintah bawaan.Sepertinya opsi ini tidak aktif secara default, setidaknya pada sistem berbasis RedHat.
Info lebih lanjut tentang halaman manual BASH :
sumber
Itu akan dikirim SIGHUP dalam pengujian saya:
Shell1:
Shell2:
Shell1 Lagi:
Shell2 Lagi :
Mengapa masih berjalan ?:
Pemrograman Tingkat Lanjut di Lingkungan Unix oleh Stevens membahas hal ini di bagian 9.10: Grup Proses yang Yatim. Bagian yang paling relevan adalah:
sumber
$ strace -e signal -p1705 Process 1705 attached --- stopped by SIGTSTP --- --- SIGTERM {si_signo=SIGTERM, si_code=SI_USER, si_pid=791, si_uid=3000090} --- +++ killed by SIGTERM +++
Aneh, jelas tidak sesuai dengan bagian yang dikutip dari Stevens.Saya menjalankan beberapa tes menggunakan CentOS 7.1 dan bash. Perhatikan ini berarti
huponexit
secaraoff
default, dan tidak aktif untuk sebagian besar tes saya.Anda perlu
nohup
ketika Anda memulai pekerjaan di terminal, karena jika Anda menutup terminal itu tanpa keluar dari shell dengan bersih , terminal mengirimkan bash sinyal SIGHUP ke shell, yang kemudian mengirimkannya ke semua anak. Jika Anda keluar dari shell dengan bersih - artinya pekerjaan tersebut harus sudah ada di latar belakang sehingga Anda dapat mengetikexit
atau menekan Control-D pada prompt perintah - tidak ada sinyal apa pun yang dikirim ke pekerjaan latar belakang dari bash.Uji:
Terminal 1
Terminal 2
(tutup terminal 1, terlihat di terminal 2):
Pekerjaan
doit.sh
:Mulai di latar belakang di Terminal 1:
Terminal 1
Strace di Terminal 2; tutup Terminal 1 setelah beberapa loop:
Terminal 2
Output di Terminal 3:
Terminal 3
Namun, jika Anda keluar
bash
, itu hanya keluar tanpa mengirim sinyal apa pun kepada anak sama sekali. Terminal akan keluar karena tidak lagi memiliki anak, tetapi tentu saja tidak ada orang yang dapat HUP karena shell anak sudah hilang. ItuSIGINT
,SIG_BLOCK
danSIG_SETMASK
Anda lihat di bawah ini disebabkan olehsleep
di shell.Terminal 1
Terminal 2
Terminal 3, keluaran
Menariknya, saya mulai
huponexit
menggunakanshopt -s huponexit; shopt
(shopt terakhir untuk meninjau), kemudian melakukan tes terakhir, dan lagi-lagi bash tidak mengirim sinyal ke proses latar belakang . Bahkan LEBIH BANYAK bersilangan, seperti yang kita lihat bash memang mengirim sinyal ke proses latar belakang setelah menerimanya dari terminal yang tertutup di wajahnya. Sepertinyahuponexit
tidak ada kaitannya dengan satu atau lain cara.Saya harap ini menghilangkan setiap misteri atau kebingungan mengenai setidaknya hashiness bash, tentang kapan dan bagaimana sinyal HUP dikirim. Setidaknya tes saya benar-benar dapat direproduksi, untuk saya. Saya akan tertarik untuk mengetahui apakah ada pengaturan lain yang mungkin memengaruhi perilaku bash.
Dan, seperti biasa, YSMV (Shell Anda Dapat Bervariasi).
Adendum 1
Ketika saya menjalankan shell as
exec /bin/sh
, kemudian jalankan script as/bin/sh ./doit.sh &
, lalu keluar shell dengan bersih, tidak ada sinyal yang dikirim ke pekerjaan latar belakang dan terus berjalan hingga selesai.Tambahan 2
Ketika saya menjalankan shell as
exec /bin/csh
, kemudian jalankan script as/bin/sh ./doit.sh &
, lalu keluar shell dengan bersih, tidak ada sinyal yang dikirim ke pekerjaan latar belakang dan terus berjalan hingga selesai.sumber
Saya menggunakan proses csh dan latar belakang terus berjalan bersama saat saya logoff.
sumber