多くの場合、スクリプト内で、後で次の形式で補助タスクをスケジュールします。
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で使用できるかどうかを確認しています。
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
を参照]が期待を台無しにしないことを確認してくださいしかし。)
一度実行されるジョブの場合、at
はすでに必要なことを正確に実行します。 atd
はいつでも、スケジュールされた日付を過ぎたすべてのスケジュールされたジョブを実行します。特に、起動時にatd
を開始すると、ダウンタイム中に期限が切れたジョブの実行がトリガーされます。
定期的なジョブの場合、固定スケジュールのcrontabエントリと@reboot
crontabエントリを組み合わせることができます。 @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
これは、batch
のat
オプションが役立つ可能性がある状況である可能性があります。
サンドボックスRHEL5マシンから、2分先にバッチジョブをスケジュールして、atdを停止することができました。 5分経ってから、またatdを始めました。 atdが開始されると、バッチジョブがすぐに開始されました。
呼び出し:batch "NOW+2 minutes"
または任意の許容可能なat
時間入力。
Fedora 16でこれを試してみると、問題が発生しました。時間入力をサポートしていると記載されているマニュアルページにもかかわらず、コマンドは引数を受け入れないと報告します。