web-dev-qa-db-ja.com

cronジョブが実行されない(pgrepの問題)

私は毎分cronジョブを実行しており、bashシェルスクリプトを起動します。

# Automatically reboot the server if it goes down
* * * * * /root/auto-restart.sh

スクリプトは手動で実行できますが、cronジョブで実行しようとすると実行されません。少しデバッグしたところ、このコマンドが原因であることがわかりました。

pgrep -fcl auto-restart.sh

要約すると、手動で実行すると、そのコマンドは正しい値を返し、スクリプトが現在実行されている場合にのみauto-restart.shを一覧表示します(必要に応じて)。

ただし、cronジョブを起動すると、pgrep -fl auto-restart.shの出力が次のように表示されます(実行中)。

3110 sh
3111 auto-restart.sh

これが私が扱っているコードのビットです:

scriptcheck=`pgrep -fcl auto-restart.sh`
if [ $scriptcheck -gt 1 ]; then
    echo "auto-restart.sh script already in use. Terminating.."
    #cron job debugging..
    echo "[DEBUG] scriptcheck returning greater than 1" > /tmp/debug.output
    echo "[DEBUG] Value of scriptcheck: ${scriptcheck}" >> /tmp/debug.output
    echo "[DEBUG] contents:" >> /tmp/debug.output
    pgrep -fl auto-restart.sh >> /tmp/debug.output
    exit
fi

ここで完全なスクリプト: https://Pastebin.com/bDyzxFXq

1
johndoe

cron/root/auto-restart.shを実行する場合、sh -c /root/auto-restart.shの行に沿ってshを使用して実行します。 pgrep-fオプションを使用したので、pgrepは実行中のプロセスのコマンドラインのどこかでauto-restart.shを探します。したがって、auto-restart.shおよびsh -c /root/auto-restart.shと一致します。後者は、pgrep -lの出力にプレーンなshとして表示されます。

pgrep -c auto-restart.sh

あなたが求めている行動をあなたに与えるでしょう。 (-lでは意味がないため、-cを削除しました。)

(サーバーにはおそらく ウォッチドッグタイマー があります。これはより適切かもしれません—サーバーがまだcronジョブを実行するのに十分に実行されているが、そうでなければダウンしていると見なされる場合、ウォッチドッグはそうではないと思います。 tトリップ。)

2
Stephen Kitt