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 & ?
background-process
nohup
Mani yang paling dicari
sumber
sumber
tmux
dan mengabaikannohup
atau menolak atau tugas latar belakang sepenuhnya.Jawaban:
Program Python Anda dibatalkan
nohup
.nohup
mengabaikan sinyal hangup denganSIG_IGN
dan 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
nohup
bisa. Pada sistem dengan shell kontrol pekerjaan dan sesi / semantik kerja POSIX, Anda harus melakukandisown
pekerjaan 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
sumber
nohup
; belum menemukan obat untuknyasetsid nohup python3 run.py > nohup.out &
, setsid telah menyelesaikan masalah ini. Apakah ini pendekatan yang tepat?