web-dev-qa-db-ja.com

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

ある条件に基づいて20分の遅延でスクリプトを実行するようにスケジュールできるようにcrontabコマンドを呼び出すにはどうすればよいですか?

編集:システムでtrueと評価された条件の回数だけスクリプトを実行するようにスケジュールするコマンドが必要な場合はどうなりますか?私のオプションは何ですか?

4
Arpith

条件をテストするためのロジックコードをスクリプト自体に配置し、cronに配置(または関連付け)しないでください。複雑なロジックは、cronが設計されたものではありません。

したがって、スクリプトで条件をテストし、それがtrueと評価された場合は、処理コードが実行されます。 falseと評価された場合は、スクリプトを正常に終了します。

スクリプトの処理の結果として「条件」が変化すると仮定すると(たとえば、処理が必要な受信ファイルのフォルダーを監視し、20mごとに1つのファイルを処理する)、すべての作業が完了しているため、最終的に条件は常に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分間隔)がホストにbecome到達可能であることを示している場合、処理コードが実行されます。

物事を少し単純化したい場合は、これを試してください。

#!/bin/bash

if [ `arping -w 59 ...` -ne 1 ]; then
  sleep 1079
  if [ `arping -w 59 ...` -eq 1 ]; then
    # do your processing here
  fi
fi

チェックに1分弱(-w 59)のarping期限を課し、睡眠量を微調整すると、2つのテストとその間の睡眠が20分以内に完了することをほぼ保証できます。 、したがって、隣接する期間と重複することはなく、別のスクリプトがまだ実行されているかどうかを確認する必要はありません。

もちろん、上記のスクリプトはいずれも、20分ごとに実行される静的なcronエントリを介して呼び出されます。

*/20 * * * * /path/to/script.sh
7
Tim

条件をチェックし、それにスリープを割り当てるbashスクリプトを作成する必要があります。次に、cronを使用して特定の時間に実行するようにそのbashスクリプトをスケジュールします。 cron自体は、条件文または「遅延後に実行」をサポートしていません。

2
Drahkar

さて、質問を分に更新しました。

したがって、20分ごとに実行する=すべての時間の0/20/40/60(= 0)分で実行します。

エントリは次のようになります。

0,20,40 * * * * /path/to/some_command

また、限られた時間だけ実行したい場合は、状態ファイルを使用して、そのスクリプトを起動した回数を保存します。

0
daisy