Bashスクリプトの条件付きcrontabコマンド

Bashスクリプトの条件付きcrontabコマンド

特定の条件に基づいて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

おすすめ記事