web-dev-qa-db-ja.com

Systemdサービス-Python起動時の画面内のスクリプト

私は現在rc.localのこのスクリプトを介してScreenセッション内でpythonスクリプトを実行しています。

screen -L -dmS pi python /home/pi/truck/main2.py &

しかし、Pythonスクリプトがクラッシュした場合に再起動できるように、systemdを介して実行したいと思います。

/systemd/system/myscript.serviceにサービスを作成してみました

[Unit]
Description=myscript
After=network.target

[Service]
Type=simple
Restart=on-failure
RestartSec=3
ExecStart=/usr/bin/screen -L -dmS pi  python /home/pi/truck/main2.py

[Install]
WantedBy=multi-user.target

しかし、それはScreenセッション内でスクリプトを実行しませんか?

実行中の画面のリストを取得すると、画面セッション「pi」が停止していることが示されます。

5
TwinToe

Type=simpleは、サービスのメインプロセスが永久に実行し続けることを期待しています。ただし、実際のコマンドは、反対に行うようにScreenに指示しています。新しいセッションを開始し、バックグラウンドにフォークします。

Screenがそれを行うと、systemdはサービスが終了したと見なし、「バックグラウンド」のScreenプロセスを含む、残っているすべてのプロセスをクリーンアップします。 (これは「失敗」として数えられることすらありません。)

これを回避するには、タイプをforkingに変更するか、画面-dmオプション-Dm

9
user1686