Sleepコマンドなしで30秒ごとにcronジョブを実行することは可能ですか?
タスクを頻繁に実行する必要がある場合、cronは間違ったツールです。それほど頻繁にジョブを起動しないという事実は別として、ジョブの起動間隔よりも実行に時間がかかる場合、深刻な問題が発生する危険性もあります。デーモン化して永続的に実行するようにタスクを書き直し、必要に応じてcronから起動します(すでに実行されている場合は再起動しないことを確認しながら)。
Linuxコマンドの most creative misuseの候補:
Nohup watch -n 30 --precise yourprog >/dev/null &
yourprog
が次の場合:
date +%M.%S.%N >> yourprog.out
その場合、yourprog.out
は次のようになります。
50.51.857291267
51.21.840818353
51.51.840910204
52.21.840513307
52.51.842455224
53.21.841195858
53.51.841407587
54.21.840629676
かなり良いレベルの精度を示しています。
コマンドの各部分の説明は次のとおりです。
Nohup
-これにより、それに続くコマンド(この場合はwatch
)がターミナルの終了時に終了しなくなります。watch
-このプログラムはコマンドを繰り返し実行します。通常、watch
がコマンドを実行するたびに、コマンドの最初の1画面分の出力が表示されます。-n 30
-コマンドを実行する間隔。この場合は30秒ごとです。--precise
-このオプションがない場合、watch
はコマンドafter interval secondsを実行します。これを使用すると、コマンドの開始ごとに begins on可能であればインターバルが開始されます。このオプションが例で指定されていない場合、起動してコマンド(yourprog
)を実行するのに時間がかかるため、時間は毎回30秒以上遅くなります。yourprog
-実行するwatch
のプログラムまたはコマンドライン。コマンドラインにシェル固有の文字(スペースやセミコロンなど)が含まれている場合は、引用符で囲む必要があります。>/dev/null
-大なり記号は、watch
によって実行されているコマンドの出力をファイル/dev/null
にリダイレクトします。そのファイルは、書き込まれたデータをすべて破棄します。これにより、出力が画面に書き込まれなくなります。または、Nohup
が使用されているため、Nohup.out
というファイルに出力が送信されなくなります。&
-watch
コマンドはバックグラウンドで実行され、制御は端末または親プロセスに戻ります。Nohup
、出力のリダイレクト、および&
バックグラウンド制御演算子はwatch
に固有のものではないことに注意してください。
次に、yourprog
スクリプトの例の説明を示します。
date
-現在の日付または時刻、あるいはその両方を出力します。それらを設定することもできます。+%M.%S.%N
-date
が使用する出力形式を指定します。 %M
は現在の分、%S
は現在の秒、%N
は現在のナノ秒です。>> yourprog.out
-date
コマンドの出力をyourprog.out
というファイルにリダイレクトします。 2つの「より大」を指定すると、以前の内容が上書きされるのではなく、呼び出しごとに出力がファイルに追加されます。編集:
おそらく悪用される可能性のある別の可能性があります(またはおそらくそれが正当な用途です)はsystemdタイマーです。
cronの代替としてのsystemd/Timers および cron vs systemd timers を参照してください。
すぐに例を掲載してみます。
Cronは1分ごとに起動するように設計されているため、ハッキングなしでそれを行うことはできません。
* * * * * /path/to/program
* * * * * sleep 30; /path/to/program
前のインスタンスがすでに実行されている場合にプログラムが終了するように、プログラムに何かを書き込むことを忘れないでください。
#!/bin/sh
if ln -s "pid=$$" /var/pid/myscript.pid; then
trap "rm /var/pid/myscript.pid" 0 1 2 3 15
else
echo "Already running, or stale lockfile." >&2
exit 1
fi
もちろん、これでも失敗する可能性は非常に小さいため、googleを検索して、環境に適用できるより良いソリューションを探してください。
サードパーティのソフトウェアでこれを行うことができます。
私にとってうまくいったオプションは 頻繁にcron です
ミリ秒の精度が可能で、現在の実行が終了するまで次の実行を延期するオプションを提供します。
私はいくつかの懸念があります:
(1)システムがビジー状態になり、30秒の時点で正確に開始できないことがある場合、あるジョブを実行しているときに別のジョブがポップし、2つ(またはそれ以上)のジョブが同じことを行う可能性があります。事。スクリプトによっては、ここで重大な干渉が発生する場合があります。したがって、そのようなスクリプトでのコーディングには、特定のスクリプトの1つのインスタンスのみが同時に実行されるようにするためのコードが含まれている必要があります。
(2)スクリプトは、オーバーヘッドが大きくなり、必要以上にシステムリソースを消費する可能性があります。これは、他の多くのシステムアクティビティと競合している場合に当てはまります。
したがって、1人の投稿者が述べたように、この場合、追加のプロセスで実行されるデーモンを入れて、操作にとって非常に重要な場合に実行され続けるようにすることを真剣に検討します。
cronエントリ:* * * * * flock -w0 /path/to/script /path/to/script
脚本:while true;do echo doing something; sleep 10s;done
* * * * * flock -w0 /path/to/log watch -n 10 echo doing >> /path/to/log
または
* * * * * flock -w0 /path/to/log watch -n 10 /path/to/script
flock
コマンドを使用すると、複数のインスタンスによるスクリプトの同時実行を回避できます。ほとんどの場合、それは非常に重要です。flock
およびwatch
コマンドは、ほとんどのLinuxインストールで使用できますwatch
コマンドを強制終了します自分のスクリプト用か、それをラップできる場合の解決策:
デーモンの構築と監視よりも頭痛の種は少ないです。
* PHPを使用している場合は、clearstatcache()を覚えておいてください。