Saya membaca jawaban dari pengguna yang mengklaim menjalankan itu
foo 2>&1 >& output.log &
akan menghasilkan foo
terus berjalan bahkan ketika mereka logout. Menurut pengguna ini, ini bahkan berfungsi melalui koneksi SSH.
Saya tidak benar-benar percaya itu, karena saya mendapat kesan bahwa dalam kasus melepaskan diri dari SSH, atau mengakhiri TTY, shell dan karena itu prosesnya akan menerima SIGHUP, menyebabkan mereka berhenti. Ini, dengan asumsi saya, adalah satu-satunya alasan untuk menggunakan nohup
dalam kasus seperti itu, atau tmux
, screen
dkk.
Saya kemudian melihat ke manual glibc :
Sinyal ini juga digunakan untuk melaporkan penghentian proses pengendalian pada terminal ke pekerjaan yang terkait dengan sesi itu; penghentian ini secara efektif memutuskan semua proses dalam sesi dari terminal pengendali.
Ini sepertinya menguatkan pikiran saya. Tetapi melihat lebih jauh, dikatakan :
Jika proses adalah pemimpin sesi yang memiliki terminal pengendali, maka sinyal SIGHUP dikirim ke setiap proses di pekerjaan latar depan, dan terminal pengendali dipisahkan dari sesi itu.
Jadi, apakah ini berarti pekerjaan yang diletakkan di latar belakang tidak akan menerima SIGHUP?
Untuk kebingungan saya lebih lanjut, saya menjalankan sesi Zsh interaktif, berlari yes >& /dev/null &
, dan mengetik exit
, ketika Zsh memperingatkan saya bahwa saya telah menjalankan pekerjaan, dan setelah mengetik exit
untuk yang kedua kalinya, mengatakan kepada saya bahwa itu telah MENGHAPUS satu pekerjaan. Melakukan hal yang persis sama di Bash membuat pekerjaan tetap berjalan ...
logout
danyes
masih berjalan.Jawaban:
Bash tampaknya mengirim
SIGHUP
hanya jika ia sendiri menerimaSIGHUP
, yang misalnya terjadi ketika terminal virtual ditutup atau ketika koneksi SSH terputus. Dari dokumentasi :Jadi, jika Anda mengetik
exit
atau menekan Ctrl+ Dsemua proses latar belakang akan tetap ada, karena ini tidak mengirim sinyal hang up ke Bash.Anda dapat memaksa Bash untuk memperingatkan Anda tentang fakta bahwa masih ada proses latar belakang dengan
Ada opsi untuk mengirim
SIGHUP
keluar saat Anda berada di shell interaktif ( lihat di sini ). Tapi itu tidak berfungsi pada mesin saya dengan Bash 4.2.25. Mungkin itu berhasil untuk Andasumber
SIGHUP
dikirim, jika tidak, dengan keluar bersih, pekerjaan terus berjalan? Itu menjelaskan apa yang saya lihat.huponexit
"hanya berlaku untuk shell login interaktif"