web-dev-qa-db-ja.com

anacronを使用して何かを一度実行するようにスケジュールする方法は?

多くの場合、スクリプト内で、後で次の形式で補助タスクをスケジュールします。

at now + 8 hours <<< "rm -f workfile.$$ >> $worklog 2>&1 "

または

at 11pm + $(date +%M) minutes <<< "./postMarketJob.sh $orderID &> $orderID.log"

問題は、サーバーとして使用しているラップトップやPCがスケジュールされた時間になるとオフになることがあるため、at jobが発生しないことです。

同じ問題がcrontabエントリにも当てはまります。

私はUbuntuの anacronのmanページ を理解しようとしています。

要求されたときに実行されるように、またはサーバーがオンラインに戻ったときにできるだけ早く実行されるようにジョブをスケジュールするツールはありますか?

anacronである必要はなく、rootのみが使用できるものである場合は、呼び出しをSudoでラップします。

明確化

タスクは(あるとしても)いくつかの固定スクリプトではなく、非常に可変であり、条件付きです。つまり、プログラム内の予期しない状態に応じて、最初にスケジュールする場合としない場合があります。

プログラムにatと同様のインターフェイスを提供する、atd/anacronの上に独自のラッパーを開発する必要があるようですが、何かがすでに存在することを望んでいました。 fcronが法案に適合しているかどうか、および一部のリポジトリでUbuntuで使用できるかどうかを確認しています。

3
Marcos

Anacronはそれが何であるかについて素晴らしいです...ジョブがすべての[〜#〜] n [〜#〜]で実行されることを保証するシステム=、再起動後-そこにはあまり制御がありません。さらに、これは常駐デーモンではないため、crondまたはatdを置き換えることはできません。起動時(または手動で呼び出されたとき)に起動し、適切な間隔を待ってからいくつかの条件をチェックし、すべてがチェックまたは実行されると終了します。

そうは言っても、atdのバックアップとして、あなたの状況で役立つかもしれません。あなたは次のようなことをすることができます:
echo '@monthly 0 custom1timejob script_or_cmd_here' >> /etc/anacrontab

次に、ジョブをスケジュールします。スクリプトに、ジョブが実行されたことをanacronに通知するもの(date +%Y%m%d > /var/spool/anacron/custom1timejobを実行することにより)、またはさらに単純なものを含めるようにします。 anacrontab(sed -i /custom1timejob/d /etc/anacrontab)からエントリを削除します。

次に、最悪の場合、次にシステムを起動したときにジョブを実行する必要があります。
(/ etc/anacrontabのRANDOM_DELAY変数とSTART_HOURS_RANGE変数[man anacrontabを参照]が期待を台無しにしないことを確認してくださいしかし。)

3
rsaw

一度実行されるジョブの場合、atはすでに必要なことを正確に実行します。 atdはいつでも、スケジュールされた日付を過ぎたすべてのスケジュールされたジョブを実行します。特に、起動時にatdを開始すると、ダウンタイム中に期限が切れたジョブの実行がトリガーされます。

定期的なジョブの場合、固定スケジュールのcrontabエントリと@rebootcrontabエントリを組み合わせることができます。 @rebootエントリで、過去24時間(または任意の間隔)にタスクが実行されていない場合にのみ、タスクを実行します。

42 5 * * * /usr/local/bin/myjob && touch /var/myjob/done
@reboot if [ -z "$(find /var/myjob.done -mtime 1)" ]; then /usr/local/bin/myjob && touch /var/myjob/done; fi

これは、batchatオプションが役立つ可能性がある状況である可能性があります。

サンドボックスRHEL5マシンから、2分先にバッチジョブをスケジュールして、atdを停止することができました。 5分経ってから、またatdを始めました。 atdが開始されると、バッチジョブがすぐに開始されました。

呼び出し:batch "NOW+2 minutes"または任意の許容可能なat時間入力。

Fedora 16でこれを試してみると、問題が発生しました。時間入力をサポートしていると記載されているマニュアルページにもかかわらず、コマンドは引数を受け入れないと報告します。

1
Jodie C