crontabを使用してスクリプトからnohupを呼び出します。

crontabを使用してスクリプトからnohupを呼び出します。

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使用には必要ありませんcrontabsystemdログアウト時にすべてのプロセスをシャットダウンするように設定しない限り、crontabシェルのシャットダウンと実行中のプロセス(またはその他)の間には対話がなく、nohup有用な効果もありません。

ローカル電子メール(mailまたはmailx)を確認し、そこに報告されたエラーメッセージを読んでくださいcron。または、less /var/mail/$USERショートカットが必要な場合も同様です。またはcrontabキャプチャで行を変更してください標準出力そして標準エラー後で見ることができるファイルとして

*/30 * * * * /home/user/scripts/keep_alive.sh >ka.log 2>&1

cron環境設定(など)を忘れてしまったため、次の環境でスクリプトが実行されないことが多いです$PATH

関連情報