通常はここに投稿しないでくださいが、私はこの髪の毛を切り取っています。起動時に分岐し、他のプロセスの束を開始するPythonスクリプトがあります。このスクリプトは、起動時にsysvinitを介して起動されていましたが、最近Debian Jessieにアップグレードしたため、systemdを介して起動するように適合させました。
残念ながら、解決できない問題に直面しています。ユーザーシェルでスクリプトを直接起動すると、その子プロセスが正しく起動され、スクリプトが終了すると、子プロセスは孤立して実行を継続します。
systemdを介して起動した場合、親プロセスが終了すると、子もすべて終了します(まあ、画面はダイで起動し、死んでいるように見えますか?)
理想的には、すべての子プロセスを強制終了せずに親スクリプトを再起動できる必要がありますが、何か足りないものはありますか?
ありがとう!
[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
編集:Pythonスクリプトは、本質的にその子プロセスの「コントローラー」であると指摘することはおそらく関連があります。中央サーバーからの要求に応じて、GNU画面でサーバーを起動および停止します。通常は常に実行されており、サービスを生成して終了しません。ただし、プロセスがpid 1に孤立していることを意味する場合でも、子プロセスを強制終了せずにスクリプトをリロードできるようにしたい場合があります。実際、Pythonスクリプトが可能であれば、親プロセス。
仕組みのより良い説明:
- Systemdは/Server.pyを生成します
- Server.pyはSystemdのpidファイルを分岐して書き込みます
- Server.pyは、その指示に基づいてgnu画面にサーバープロセスを生成します
- Server.pyは、サーバーから要求された再起動を実行するために実行を続けます
Systemdを使用せずに起動すると、Server.pyを再起動でき、起動するgnu画面は影響を受けません。Systemdで起動すると、Server.pyがシャットダウンすると、それらのスクリーンプロセスがpid 1に孤立する代わりに、それらは強制終了されます。
simple
またはforking
実際には、)、最後は次のようになりType=oneshot
、RemainAfterExit=yes
そしてKillMode=control-group
。
Server.py
コードと起動されたサービスのフォーク方法(フォークする場合)がなければ、ソリューションを提供するのは困難です。ただし、一般的に言えば、これは準備プロトコル不一致の問題です。