Setelah masuk ssh
, saya mengetik perintah ini di bash
:
sleep 50000000000000 &
Lalu aku kill -9
yang sleep
proses induk proses (yaitu, bash
). Kemudian jendela terminal terputus secara bersamaan.
Ketika saya masuk lagi, saya menemukan bahwa sleep
prosesnya masih hidup.
Pertanyaan : Mengapa sleep
proses bisa bertahan ketika saya logout dan terminal ditutup? Dalam pikiran saya, segala sesuatu kecuali daemon dan nohup
program akan terbunuh saat logout. Jika sleep
dapat bertahan dengan cara ini, apakah ini berarti saya dapat menggunakan metode ini alih-alih nohup
perintah?
&
akan memotong proses ke latar belakang (seperti daemon) dan tetap berjalan walaupun Anda sudah keluar.Jawaban:
Tl; dr:
Kecuali jika
bash
instance yang dimunculkan olehssh
memilikihuponexit
set opsi, tidak ada proses akan dihentikan dengan cara apa pun pada saat keluar / log out, dan ketikahuponexit
opsi ditetapkan, menggunakankill -9
pada shell bukanlah alternatif yang baik untuk digunakannohup
pada proses anak-anak shell;nohup
pada proses cangkang anak masih akan melindungi mereka dari SIGHUP yang tidak datang dari cangkang, dan bahkan ketika itu tidak pentingnohup
masih lebih disukai karena memungkinkan cangkang diakhiri dengan anggun.Di
bash
sana ada opsi yang disebuthuponexit
, yang jika diatur akan membuatbash
SIGHUP anak-anaknya saat keluar / keluar;Dalam instance non-login interaktif
bash
, seperti dalambash
instance yang dibuat olehgnome-terminal
, opsi ini diabaikan; apakahhuponexit
diatur atau tidak disetel,bash
anak-anak tidak akan pernah DIJELASKANbash
saat keluar;Dalam instance login interaktif
bash
, seperti dalambash
instance yang dibuat olehssh
, opsi ini tidak diabaikan (namun tidak disetel secara default); jikahuponexit
diatur,bash
anak-anak akan DIJELASKANbash
saat keluar / keluar; jikahuponexit
tidak disetel,bash
anak-anak tidak akan DIJELASKANbash
saat keluar / keluar;Jadi secara umum keluar / keluar dari
bash
instance login interaktif , kecuali jikahuponexit
opsi disetel, tidak akan membuat shell SIGHUP anak-anaknya, dan keluar / keluar daribash
instance non-login interaktif tidak akan membuat shell SIGHUP anak-anaknya bagaimanapun;Namun, ini tidak relevan dalam kasus ini: menggunakan
kill -9
sleep
akan tetap bertahan, karena membunuh proses induknya (bash
) tidak akan meninggalkan kesempatan bagi yang terakhir untuk melakukan apa pun pada yang pertama (yaitu, misalnya, jikabash
instance saat ini adalahbash
instance login danhuponexit
opsinya diset, untuk SIGHUP itu).Menambah ini, tidak seperti sinyal lain (seperti sinyal SIGHUP dikirim ke
bash
), sinyal SIGKILL tidak pernah disebarkan ke proses anak proses, karenanyasleep
bahkan tidak dibunuh;nohup
memulai proses yang kebal terhadap sinyal SIGHUP, yang merupakan sesuatu yang berbeda; itu akan mencegah proses menggantung pada penerimaan sinyal SIGHUP, yang dalam hal ini dapat diterima olehbash
instance login interaktif jikahuponexit
opsi telah diatur dan shell keluar; jadi secara teknis menggunakannohup
untuk memulai proses dalambash
instance login interaktif denganhuponexit
opsi tidak disetel akan mencegah proses menggantung pada penerimaan sinyal SIGHUP, tetapi keluar / keluar dari shell tidak akan SIGHUP terlepas;Namun, secara umum, ketika
nohup
diperlukan untuk mencegah sinyal SIGHUP yang berasal dari shell induk, tidak ada alasan untuk lebih sukakill -9
metode induk pada metodenohup
on the child; sebaliknya, seharusnya sebaliknya.Membunuh orang tua menggunakan
kill -9
metode ini tidak memberikan kesempatan bagi orang tua untuk keluar dengan anggun, sementara memulai anak menggunakannohup
metode ini memungkinkan orang tua untuk dihentikan oleh sinyal lain, seperti SIGHUP (untuk membuat contoh yang masuk akal dalam konteks seorang anak mulai menggunakannohup
), yang memungkinkan untuk keluar dengan anggun.sumber
ps -e | grep process
harus mendaftarkan proses bersama dengan PID (atau lebih baik hanyapgrep -x process
jika Anda yakin akan mencocokkan proses tunggal itu dan bukan hal-hal yang tidak memiliki tenda); masalahnya adalah bahwa ketika Anda membunuh proses dengankill -9
anak-anaknya dimilikiupstart
, maka PPID asli mereka hilang dan PPID mereka berubah menjadi PID pemula, membuat mereka tidak dapat dikenali (AFAIK) tetapi untuk nama mereka atau PIDnohup
akan gagal untuk mencegah proses menutup setelah menerima sinyal SIGHUP dari proses induk? Saya mencoba menjalankan proses di latar belakang (di terminal shell SST Putty) olehnohup <command> <arg> &
. Ketika saya keluar dengan mengklikX
tombol Putty , proses latar belakang akan segera berakhir. Ketika saya keluar dengan mengetikkanexit
terminal shell Putty SSH, proses akan terus berjalan di latar belakang.bash
secara default tidak mengirimkan sinyal HUP ke proses anak saat keluar . Lebih detail (terima kasih @kos), tidak pernah melakukannya untuk kerang non-login .Anda dapat mengonfigurasi bash untuk melakukannya untuk shell login jika menetapkan opsi
huponexit
. Di terminal, lakukan:(ini memulai shell "login" baru)
Sekarang periksa
sleep
prosesnya:... tidak berjalan: telah menerima sinyal HUP dan keluar seperti yang diminta.
sumber
sleep 1000 & ; exit
yangsleep
bertahan? Perhatikan bahwa jika sayakill -HUP
yangsleep
proses itu akan keluar. Dan bahkan jikahuponexit
diatur,sleep
bertahan. Bingung ... (Saya akan mencoba memahami dengan lebih baik dan memodifikasi asnwer, kalau tidak saya akan menghapusnya).kill -9
benar-benar bukan cara yang seharusnya. Ini seperti menembak dengan pistol di TV untuk mematikannya. Selain komponen komedi tidak ada keuntungan. Proses tidak dapat menangkap atau mengabaikanSIGKILL
. Jika Anda tidak memberikan proses kesempatan untuk menyelesaikan apa yang dilakukan dan dibersihkan, proses itu mungkin meninggalkan file yang rusak (atau keadaan lainnya) dan tidak akan dapat memulai lagi.kill -9
adalah harapan terakhir, ketika tidak ada lagi yang berhasil.Apa yang terjadi dalam kasus Anda:
Proses induk
sleep
adalahbash
shell yang sedang berjalan . Ketika Andakill -9
bash itu, proses bash tidak memiliki kesempatan untuk mengirimSIGHUP
ke salah satu proses anaknya, karenaSIGKILL
(yang dikirim olehkill -9
) tidak dapat ditangkap oleh proses. Proses tidur terus berjalan. tidur sekarang menjadi proses anak yatim .Proses init (PID 1) melakukan mekanisme yang disebut reparenting. Itu berarti bahwa proses init sekarang menjadi induk dari proses yatim itu. init adalah pengecualian, proses dapat menjadi anak itu karena mengumpulkan proses yang kehilangan proses induk aslinya. Btw: A daemon (seperti
sshd
) melakukan itu ketika "pergi di latar belakang".Jika itu tidak terjadi, proses yatim piatu nantinya (setelah selesai) menjadi proses zombie. Inilah yang terjadi ketika
waitpid()
tidak dipanggil (tanggung jawab proses induk yang tidak dapat dipenuhi ketika ketika proses itu terbunuh). init memanggilwaitpid()
dalam intervensi khusus untuk menghindari anak-anak zombie.sumber
TERM
atauHUP
huponext
. Dan JANGKA akan menunggu sampai tidur selesai. Dalam kasus perintah tidur OP, itu akan menjadi ribuan tahun =)The
&
dimulai proses di latar belakang. Jika Anda mengetikps -ef
, Anda akan melihat bahwa ID proses induk (PPID) dari tidur Anda adalah bash Anda. Kemudian logout dan login lagi. Proses akan tetap berjalan setelah Anda keluar. Setelah Anda masuk untuk kedua kalinya Anda menjalankanps -ef
lagi. Anda akan melihat bahwa sekarang orang tua dari proses tidur Anda akan diproses dengan id "1". Itu init, induk dari semua proses.sumber
Penggunaan
&
akan menyebabkan program berjalan sebagai latar belakang. Untuk melihat program di latar belakang gunakanbg
perintah, dan untuk membuatnya berjalan sebagai latar depan lagi, jalankanfg
.Ya, ada banyak cara untuk menjaga program tetap berjalan meskipun terminal utama sudah keluar.
sumber
huponexit
hanya bekerja pada shell login seperti shell yang diperoleh melaluissh
(dan tidak, katakanlah, dalam shell yang diperoleh viagnome-terminal
)