特別な状況でクローンの作業スケジュールを自動的に変更する方法はありますか?
簡単な例を挙げると、休日中の給与処理は、cronで計画されたものより1日遅く実行する必要があります。
スクリプト、構成、環境変数でこれを達成できますか?それとも誰かが手動で変更する必要がありますか?
答え1
これはcronがサポートするものではありません。しかし、問題を解決するためにスクリプトを作成することは可能です。
あなたの例を見ると、プロセスが実行されるべき日付を保存する一種の議題/リストが必要です。
次に、毎日スクリプトを実行して、スケジュール/リストの日付が一致することを確認するcrontabエントリを作成する必要があります。そうでなければ何もしないでください。ただし、一致するものがあればプロセスが開始されます。
答え2
単純なケースではそうです。ただし、やや複雑な場合は、給与計算用のラッパースクリプトを作成する必要があります。
たとえば、クローンジョブは給与ハンドラを直接実行する必要はありません。ラッパースクリプトで実行できます(まだ実行していない場合は実行する必要があります)。
たとえば、「myjob.sh」というスクリプトは次のようになります。
#!/bin/bash
delayfile=/path/to/myjob.delay
if [ -e "$delayfile" ] ; then
sleep $(cat "$delayfile)
rm "$delayfile"
fi
# now set up whatever variables etc are needed and
# execute the actual payroll processing program
遅延のため次(そして次回のみ)日中にcronジョブを実行した後、次のように簡単に実行できます(シェルからそのディレクトリにファイルを作成する権限を持つユーザーとして)。
echo 86400 > /path/to/myjob.delay
上記のスクリプトスニペットは、cronジョブが毎日実行されないと想定しています。もしそうなら、次のインスタンスはスリープモードの終了と同時に実行されます。
ジョブが毎日実行されている場合は、次のことができます。
#!/bin/bash
skipfile=/path/to/myjob.skip
if [ -e "$skipfile" ] ; then
rm "$skipfile"
exit 0
fi
# now set up whatever variables etc are needed and
# execute the actual payroll processing program```
スキップファイルが存在する場合(たとえば、touch /path/to/myjob.skip
シェルで実行されている場合)、スクリプトはそのファイルを削除してすぐに終了します。次のcronジョブの実行は正常に完了します。
これらはすべてとても簡単ですたとえば、可能性について最も簡単なアイデアを提供します。スクリプトは、条件の確認、必要なだけ複雑さ、外部プログラムの実行、データベース項目の照会、リモートWebサーバーのjson APIクエリなどに必要なすべての操作を実行できます。
cron自体では、比較的簡単な操作を実行できます。たとえば、上記の作業はcronで実行できるほど簡単です。
週刊版:
00 01 * * 7 [ -e /path/to/myjob.delay ] && sleep $(cat /path/to/myjob.delay) && rm /path/to/myjob.delay && your-payroll-program
毎日のバージョン:
00 01 * * * [ -e /path/to/myjob.skip ] && (rm /path/to/myjob.skip && exit 0) || your-payroll-program
私の考えでは、ラッパースクリプトを使用する方が良いと思います。読みやすく、メンテナンスも簡単で、shやbashだけでなく、好きなスクリプト言語も使用できます。また、論理的に同じ一連の-ed / or -ed句で合理的に実行できる操作には制限があり、1行が理解できない横説説に変わる前に合理的に実行できる操作にも制限があります。スクリプトでスキップと遅延機能を組み合わせるのは非常に簡単ですが、1行またはcrontabエントリで実行するのは難しいです。