crontabを使用して長期実行スクリプトを確認して再実行しようとしています。状態を確認し、必要に応じて長期実行スクリプトを実行するスクリプトを作成しました。
ログアウト時にも実行が継続されるように、長時間実行スクリプトを実行するためにnohupを使用しています。
接続維持スクリプト:
#!/bin/bash
BASE_PATH=~/scripts
LOG_PATH=${BASE_PATH}/keep_alive.log
write_to_log () {
date >> ${LOG_PATH}
echo ${1} >> ${LOG_PATH}
echo "--------------" >> ${LOG_PATH}
}
pid=$(pgrep long_script)
if [ -z "${pid}" ]; then
write_to_log "long_script is no runnig, starting..."
nohup ${BASE_PATH}/long_script.py &
fi
クローンタブ項目:
*/30 * * * * /home/user/scripts/keep_alive.sh
スクリプトを手動で実行すると(bash、./keep-alive.sh)、すべてがうまく機能し、長いスクリプトが起動します。
crontabでは、スクリプトがすぐに起動して終了し(パス/表現に問題はありません)、ログが記録されていることがわかりますが、長いスクリプトがフリーズします。だから私の結論は、nohupがbashとcrontabで異なる動作をするということです。
私はsetidまたはdisownを使うのに疲れましたが、同じ結果が得られます。
どうすれば解決できますか?ありがとうございます。
答え1
nohup
使用には必要ありませんcrontab
。systemd
ログアウト時にすべてのプロセスをシャットダウンするように設定しない限り、crontab
シェルのシャットダウンと実行中のプロセス(またはその他)の間には対話がなく、nohup
有用な効果もありません。
ローカル電子メール(mail
またはmailx
)を確認し、そこに報告されたエラーメッセージを読んでくださいcron
。または、less /var/mail/$USER
ショートカットが必要な場合も同様です。またはcrontab
キャプチャで行を変更してください標準出力そして標準エラー後で見ることができるファイルとして
*/30 * * * * /home/user/scripts/keep_alive.sh >ka.log 2>&1
cron
環境設定(など)を忘れてしまったため、次の環境でスクリプトが実行されないことが多いです$PATH
。