Menanyakan hal ini setelah diskusi yang panjang dengan rekan kerja, saya ingin klarifikasi di sini.
Saya meluncurkan proses latar belakang, baik dengan menambahkan " &
" ke baris perintah atau dengan menghentikannya CTRL-Z
dan melanjutkannya di latar belakang dengan " bg
". Lalu saya logout.
Apa yang terjadi?
Kami cukup yakin itu seharusnya dibunuh oleh SIGHUP, tetapi ini tidak terjadi; setelah masuk lagi, proses berjalan dengan gembira dan pstree
menunjukkan bahwa itu "diadopsi" oleh init
.
Apakah ini perilaku yang diharapkan?
Tapi kalau begitu, apa tujuan nohup
perintah itu? Sepertinya prosesnya tidak akan mati, dengan atau tanpa itu ...
Edit 1
Beberapa detail lebih lanjut:
- Perintah diluncurkan dari sesi SSH, bukan dari konsol fisik.
- Perintah diluncurkan tanpa
nohup
dan / atau&
; itu kemudian ditangguhkanCTRL-Z
dan dilanjutkan di latar belakang denganbg
. - Sesi ssh tidak turun. Ada logout ("
exit
" perintah) yang sebenarnya. - Prosesnya adalah
scp
operasi penyalinan file. - Setelah masuk lagi,
pstree
menunjukkan proses berjalan dan menjadi anakinit
.
Edit 2
Untuk menyatakan pertanyaan dengan lebih jelas: apakah menempatkan proses di latar belakang (menggunakan &
atau bg
) membuatnya diabaikan SIGHUP
, seperti halnya yang dilakukan nohup
perintah?
Edit 3
Saya mencoba mengirim SIGHUP
ke scp
: keluar secara manual , jadi pasti tidak mengabaikan sinyal.
Kemudian saya mencoba lagi meluncurkannya, meletakkannya di latar belakang dan log off: itu "diadopsi" oleh init
dan terus berjalan, dan saya menemukannya di sana ketika masuk kembali.
Saya cukup bingung sekarang. Sepertinya tidak SIGHUP
dikirim sama sekali sampai log off.
sumber
1>/dev/null 2>&1
untuk bash, dll?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
Saya setuju dengan Warner dan hanya ingin menambahkan bahwa Anda dapat menjaga agar shell tidak mengirimkan SIGHUP dengan perintah builtin "disown". Halaman bash man berisi deskripsi yang bagus.
sumber
Anda dapat menggunakan perintah nohup untuk meluncurkan perintah dan mengarahkan output ke file keluaran nohup. Dari halaman manual nohup:
Opsi lainnya adalah menggunakan perintah layar . Manfaat menggunakan layar adalah Anda dapat menyambung kembali ke proses nanti.
sumber
Saat Anda memalsukan proses ke latar belakang itu masih akan menjadi proses anak dari shell yang mengeksekusinya.
Semua proses anak yang berjalan di bawah shell dikirim SIGHUP saat keluar. Performa sedikit berbeda tergantung pada situasi yang tepat, yang secara terperinci terinci dalam halaman manual bash. Kerang lain kemungkinan memiliki deskripsi yang serupa.
Apache, dan daemon lainnya, biasanya memuat ulang konfigurasi pada SIGHUP. Utilitas Userspace sering mati. Kinerja aplikasi yang dikaitkan dengan sinyal bisa unik untuk aplikasi tersebut.
sumber
Bagaimana prosesnya? Kinerja yang dijelaskan dalam posting sebelumnya 1 akurat.
Fungsi dan proses skrip tertentu dapat menjebak sinyal. sementara loop bisa kabur seperti orang gila.
Lihat:
Sesi SSH turun - Apakah perintah terus dijalankan?
Edit 1 pada 16:22
Dari halaman bash:
Penelitian awal 1 menunjukkan bahwa OpenSSH mungkin mengabaikan SIGHUP, mungkin lebih banyak sinyal.
sumber
Jika Anda tidak meluncurkan perintah melalui alat suka
screen
, maka ketika sesi berakhir, maka lakukan semua pekerjaan / tugas yang terkait dengan sesi itu.sumber
tail -f
file temp. Ini pada mesin CentOS 7.1 menggunakan bash.