特定の長期実行プロセス(永久になど)が実行されていることを確認し、そうでない場合は再起動する単純なスクリプトがあります(一部の詳細は省略されています)。
#!/bin/bash
PROC_LIST=$(ps ax | grep <stuff>)
while read cfg
do
PROC_NAME=$(echo $cam_cfg | cut -f2 -d' ')
PROC_COUNT=$(echo $PROC_LIST | tr ' ' '\n' | grep $PROC_NAME | wc -l)
if [[ $PROC_COUNT -eq 0 ]]; then
echo "Starting process for $PROC_NAME"
<process start> 2> /dev/null &
fi
done < $CONFIG
ここでのアイデアは、関連するプロセスのリストを取得し、設定ファイルに指定されたキーワードが含まれていることを確認することです。重要なのは、必要に応じて & を使用してプロセスを分岐することです。スクリプトを手動で実行すると機能します。
私はSystemdがこのスクリプトを30秒ごとに実行したいと思います。このために、以下のユニットを作成しました。
提供する:
[Unit]
Description=Check processes
[Service]
Type=oneshot
WorkingDirectory=/home/user/scripts
ExecStart=/home/user/scripts/watchdog.sh /config
User=user
[Install]
WantedBy=multi-user.target
時間制労働者:
[Unit]
Description=Check running processes
[Timer]
OnBootSec=30s
OnActiveSec=30s
[Install]
WantedBy=timers.target
Type = oneshotを使用したときに監視対象のプロセスがまったく起動しなかったため、30秒ごとにタイマーが起動し、すべてのプロセスを再起動しようとしました。私はフォークするので、サービスが終了すると、すべてのサブプロセスも終了するためだと思います。
Type = forkingを使用すると、プロセスが必要に応じて開始および継続されることを確認できます。ただし、この場合、タイマーは予約されていないため再実行されません。私はこれがフォークされたサービスを再度有効にする必要があることを認識していないからだと思います。だから:
- 何が起こっても、スクリプトが30秒ごとに実行されるように上記の問題をどのように解決できますか?
- この演習では、実際にsystemdと戦うように感じます。より良いデザインがありますか? CONFIG はランダムで潜在的に動的なリストなので、各項目に対してシステム サービスを作成するのは少し消えます。