私は現在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」が停止していることが示されます。
Type=simple
は、サービスのメインプロセスが永久に実行し続けることを期待しています。ただし、実際のコマンドは、反対に行うようにScreenに指示しています。新しいセッションを開始し、バックグラウンドにフォークします。
Screenがそれを行うと、systemdはサービスが終了したと見なし、「バックグラウンド」のScreenプロセスを含む、残っているすべてのプロセスをクリーンアップします。 (これは「失敗」として数えられることすらありません。)
これを回避するには、タイプをforking
に変更するか、画面-dm
オプション-Dm
。