特定の条件に基づいて20分の遅延で実行されるようにスクリプトをスケジュールするためにcrontabコマンドを呼び出すにはどうすればよいですか?
編集:システムが条件がtrueと評価される回数だけスクリプトを実行するようにスケジュールするコマンドが必要な場合はどうすればよいですか。私のオプションは何ですか?
答え1
条件をテストするための論理コードをスクリプト自体に入れ、cronに入れたり関連付けたりしないでください。 cronは複雑なロジックのために設計されていません。
したがって、スクリプトで条件をテストでき、条件が真と評価されると処理コードが実行されます。評価結果がfalseの場合、スクリプトを完全に終了します。
処理スクリプトによって「条件」が変更されたと仮定すると(処理する必要のある受信ファイルを含むフォルダを監視し、20分ごとにファイルを処理する)、すべての操作がすべて完了したため、最終的に条件は常にfalseと評価されます。
あなたの意見を見ると、特定のサーバーの可用性を監視しているようです。
私はbashをあまり使用しませんが、これはどうですか?
#!/bin/bash
if [ `ps ax | grep $0 | wc -l` -le 3 ]; then #1
if [ `arping ...` -ne 1 ]; then #2
sleep 1200
if [ `arping ...` -eq 1 ]; then #3
# do your processing here
fi
fi
fi
最初のifステートメント(#1)は、これが実行中の特定のスクリプトの唯一のインスタンスであることを確認します。他のスクリプトが(まだ)実行されている場合は終了し、何もしません。
2番目(#2)は、最初の「ホストにpingを送信できるかどうか」テストです。そうでない場合、スクリプトは1200秒(20分)待ってから再テストします(#3)。
したがって、2つのping(20分間隔)がホスト上にあることを示す場合~になる到達可能であれば処理コードが実行されます。
少し簡単にしたい場合は、以下を試してください。
#!/bin/bash
if [ `arping -w 59 ...` -ne 1 ]; then
sleep 1079
if [ `arping -w 59 ...` -eq 1 ]; then
# do your processing here
fi
fi
確認のためにarpブロック時間を1分未満(-w 59)に設定し、睡眠量を調整すると、2つのテスト間の睡眠が20分以内に完了することが保証されるため、t隣接期間と重なり、他のスクリプトはまだ実行中であることを確認する必要はありません。
もちろん、上記のスクリプトの1つは、20分ごとに実行される静的cronエントリを介して呼び出すことができます。
*/20 * * * * /path/to/script.sh
答え2
条件を確認してここにスリープモードを割り当てるには、bashスクリプトを作成する必要があります。次に、cronを使用して特定の時間に実行するようにbashスクリプトをスケジュールします。 Cron自体は条件文や「遅延後の実行」をサポートしていません。
答え3
いいですね。これで質問を数分に更新しました。
したがって、全体の時間は20分= 0 / 20 / 40 / 60(= 0)分ごとに実行されます。
項目は次のとおりです。
0,20,40 * * * * /path/to/some_command
限られた回数だけ実行するには、ステータスファイルを使用してスクリプトを起動した回数を保存します。