Biasanya tidak memposting di sini tapi saya ripping rambut saya lebih dari ini. Saya memiliki skrip Python yang bercabang saat diluncurkan, dan bertanggung jawab untuk memulai banyak proses lainnya. Skrip ini dulunya diluncurkan saat startup melalui sysvinit, tetapi baru-baru ini saya memutakhirkan ke Debian Jessie sehingga telah mengadaptasinya untuk diluncurkan melalui systemd.
Sayangnya, saya mengalami masalah yang tidak bisa saya selesaikan. Ketika Anda meluncurkan skrip secara langsung di shell pengguna, itu meluncurkan proses anak itu dengan benar, dan ketika skrip keluar proses anak menjadi yatim piatu dan terus berjalan.
Ketika diluncurkan Via systemd, jika proses induk keluar, anak-anak juga akan keluar (Ya, Layar yang mereka luncurkan mati dan muncul sebagai Mati ???)
Idealnya saya harus bisa memulai kembali skrip induk tanpa membunuh semua proses anak, apakah ada sesuatu yang saya lewatkan?
Terima kasih!
[Unit]
Description=Server commander
After=network.target
[Service]
User=serveruser
Type=forking
PIDFile=/var/Server/Server.pid
ExecStart=/var/Server/Server.py
ExecStop=/bin/kill -s TERM $MAINPID
[Install]
WantedBy=multi-user.target
Sunting: Mungkin relevan bagi saya untuk menunjukkan bahwa skrip Python pada dasarnya adalah 'pengontrol' untuk proses anaknya. Ini memulai dan menghentikan server di layar gnu seperti yang diminta dari server pusat. Biasanya selalu berjalan, itu tidak menelurkan layanan dan keluar. Namun ada beberapa kasus di mana saya ingin dapat memuat ulang skrip tanpa membunuh proses anak, bahkan jika itu berarti prosesnya menjadi yatim menjadi pid 1. Sebenarnya, bahkan tidak masalah jika skrip Python memulai proses sebagai proses induk, jika itu bahkan mungkin.
Penjelasan yang lebih baik tentang cara kerjanya:
- Systemd memunculkan / Server.py
- Server.py memetik dan menulis file pid untuk Systemd
- Server.py kemudian memunculkan proses server di layar gnu berdasarkan instruksinya
- Server.py terus berjalan untuk melakukan restart yang diminta dari server
Ketika meluncurkan tanpa Systemd, Server.py dapat di-restart dan layar gnu yang diluncurkan tidak terpengaruh. Saat meluncurkan dengan Systemd, ketika Server.py dimatikan, alih-alih proses layar tersebut menjadi yatim piatu ke pid 1, mereka terbunuh.
simple
atau forking
, sebenarnya), pilihan terakhir adalah Type=oneshot
, RemainAfterExit=yes
dan KillMode=control-group
.
Server.py
kode dan deskripsi bagaimana garpu layanan diluncurkan (jika mereka bercabang). Namun, secara umum, ini adalah masalah ketidakcocokan protokol kesiapan .