最初のサービスが期待どおりに機能するように努めていますsystemd
。これが私が持っているものです:
gateway-watchdog.service
:
# A systemd service for the Gateway Watchdog
[Unit]
Description=gateway-watchdog: Watchdog to ensure that Gateway (gateway.py) is running
[Service]
Type=simple
User=root
WorkingDirectory=/home/ubuntu/lora_gateway/
ExecStart=/home/ubuntu/lora_gateway/watchdog.sh
[Install]
WantedBy=multi-user.target
gateway-watchdog.timer
:
[Unit]
Description=gateway-watchdog: Timer to run the associated gateway-watchdog service
[Timer]
# Run service 1 minute after boot
OnBootSec=1min
# Run service 15 minutes after the last run
OnUnitActiveSec=30s
[Install]
WantedBy=timers.target
watchdog.sh
次の行があります(一部のif
ステートメントに含まれています)。
#!/bin/bash
...
if [[condition]]; then
command="python3 gateway.py"
# Process needs to be run in the background with '&'. If it isn't, the systemd service will treat this script
# as still running and so not re-run it at the time specified by the timer service.
echo "2 $(date +'%F %T'): Running: $command" >> $LOG_FILE_PATH
eval "$command"
# Command must be run using eval. If it isn't, the ampersand at the end of the command is effectively ignored
exit
fi
私は必要です:
サービスが実行されますwatchdog.sh
。if
スクリプトの条件が true の場合は、別のプロセスで開始して終了し、そのサービスはもうアクティブとは見なされなくなり、30 秒後に再実行されますwatchdog.sh
。python3 gateway.py
さまざまなサービスをさまざまに組み合わせて(、およびを試しType
ました)、および/またはコマンドラインの最後に、および/または両方を使用します。simple
oneshot
forking
&
ExecStart
nohup
gateway.py
アクティブのままにするとpython3 gateway.py
常にサービスの一部になるため、CGroup
サービスは維持されますactive (running)
。
私が望むことを達成するためにこの行動をどのように変えることができますか?どんなアイデアでも大いに感謝します。
編集する:Uの提案に従って変更された内容を反映するために、上記のファイルの内容を更新しました。
上記の文書に基づいて、sudo systemctl status gateway-watchdog.service
以下を提供します。
● gateway-watchdog.service - gateway-watchdog: Watchdog to ensure that Gateway (gateway.py) is running
Loaded: loaded (/etc/systemd/system/gateway-watchdog.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2022-01-13 01:45:25 UTC; 8s ago
TriggeredBy: ● gateway-watchdog.timer
Main PID: 30684 (watchdog.sh)
Tasks: 3 (limit: 4435)
CGroup: /system.slice/gateway-watchdog.service
├─30684 /bin/bash /home/ubuntu/lora_gateway/watchdog.sh
└─30696 python3 gateway.py
Jan 13 01:45:25 ubuntu systemd[1]: Started gateway-watchdog: Watchdog to ensure that Gateway (gateway.py) is running.
良い:gateway.py
プロセスはまだ実行中です。エラー:以前の実行はまだアクティブなため、サービスは30秒間再実行されません。
&
back を入れると次のようcommand="python3 gateway.py &"
にsudo systemctl status gateway-watchdog.service
なります。
● gateway-watchdog.service - gateway-watchdog: Watchdog to ensure that Gateway (gateway.py) is running
Loaded: loaded (/etc/systemd/system/gateway-watchdog.service; enabled; vendor preset: enabled)
Active: inactive (dead) since Thu 2022-01-13 01:49:05 UTC; 6s ago
TriggeredBy: ● gateway-watchdog.timer
Process: 33724 ExecStart=/home/ubuntu/lora_gateway/watchdog.sh (code=exited, status=0/SUCCESS)
Main PID: 33724 (code=exited, status=0/SUCCESS)
Jan 13 01:49:05 ubuntu systemd[1]: Started gateway-watchdog: Watchdog to ensure that Gateway (gateway.py) is running.
Jan 13 01:49:05 ubuntu systemd[1]: gateway-watchdog.service: Succeeded.
良い:サービスは非アクティブなので、30秒後に再度実行されます。悪い:python3 gateway.py
プロセスはすぐに終了します。
答え1
参考に解決方法を見つけましたhttps://stackoverflow.com/a/57041270/2909854。現在の行はcommand
次のとおりですwatchdog.sh
。
command="systemd-run --scope -E setsid nohup python3 $GATEWAY_SCRIPT_PATH"
Type
また、私のサービス設定をに変更してforking
追加する必要がありましたTimeoutSec=1
。タイムアウトが必要かどうかはわかりませんが、少なくともデバッグするのに役立ちます。