Mengapa proses latar belakang nohup terbunuh?

10

Saya mencoba memulai skrip shell melalui sesi jarak jauh, yang memulai proses di latar belakang menggunakan perintah.

nohup python3 run.py > nohup.out &

Ketika sesi jarak jauh ditutup, proses terbunuh dengan pesan:

Sinyal tertangkap SIGHUP

SIGHUP tertangkap tetapi tidak di-daemonisasi. Keluar.

Saya tidak mengerti; mengapa proses terbunuh saat dimulai di latar belakang menggunakan nohup & ?

Mani yang paling dicari
sumber
1
Saya dulu bingung dengan semua perilaku tak terduga dari kontrol pekerjaan shell. Sekarang saya hanya menggunakan tmuxdan mengabaikan nohupatau menolak atau tugas latar belakang sepenuhnya.
Siyuan Ren

Jawaban:

10

Program Python Anda dibatalkan nohup.

nohupmengabaikan sinyal hangup dengan SIG_IGNdan kemudian memuat program Anda dalam proses yang sama.

Program Python Anda segera mengatur ulang penanganan sinyal untuk sinyal hangup, memasang pengendali sinyal sendiri. Pawang itu memeriksa fungsi internal (yang tidak dirancang dengan sangat baik, didasarkan pada beberapa asumsi yang salah, jika itu salah satu yang telah saya lihat) dan memutuskan bahwa tindakan yang tepat saat menerima sinyal hangup adalah dengan mencetak pesan itu. dan keluar.

Program Python Anda menurut desain tidak nohupbisa. Pada sistem dengan shell kontrol pekerjaan dan sesi / semantik kerja POSIX, Anda harus melakukan disownpekerjaan tersebut agar shell tidak pernah tahu tentang hal itu untuk mengirim sinyal hangup ke sana.

(Bahkan itu tidak cukup pada sistem operasi systemd. Karena orang-orang systemd telah membuat sedikit telinga babi dari mekanisme sesi login ruang-pengguna mereka, Anda juga perlu memastikan bahwa mekanisme systemd yang memberi sinyal shutdown sistem, daripada hangup, untuk sesi login di setiap logout juga tidak masuk.)

Bacaan lebih lanjut

JdeBP
sumber
3
Apakah program Python mereka yang melakukannya, atau interpreter Python (/ run-time environment) yang melakukannya diam-diam di belakang mereka?
ilkkachu
Juga, pada Mac OS, keluar dari sesi ssh membunuh pekerjaan shell Anda, bahkan ketika mulai menggunakan nohup; belum menemukan obat untuknya
imhotap
Nah, jika masalahnya adalah penangan sinyal OP bisa dengan mudah mengubah penangan sinyal ke penangan yang tidak membunuh proses. Ini harus bekerja secara independen dari siapa yang memasang penangan sinyal tersebut. Saya ingin menambahkan tentang ssh: kadang-kadang, bahkan jika proses itu tetap hidup, mungkin ada masalah. Beberapa tahun yang lalu saya kehilangan beberapa waktu untuk mencoba memahami beberapa kesalahan izin dan, pada akhirnya, pelakunya adalah Kerberos: ketika sesi ssh ditutup, token telah kedaluwarsa, jadi saya harus membuat token baru untuk digunakan, bukan yang dari sesi ssh.
Bakuriu
@ JdeBP Saya mencoba setsid nohup python3 run.py > nohup.out &, setsid telah menyelesaikan masalah ini. Apakah ini pendekatan yang tepat?
Mostwanted Mani