sleepコマンドなしで30秒ごとにcronジョブを実行することは可能ですか?
sleepコマンドなしで30秒ごとにcronジョブを実行することは可能ですか?
回答:
タスクを頻繁に実行する必要がある場合、cronは間違ったツールです。ジョブを頻繁に起動しないという事実はさておき、ジョブの起動間隔よりもジョブの実行に時間がかかると、深刻な問題が発生する危険もあります。デーモン化して永続的に実行するようにタスクを書き直し、必要に応じてcronから起動します(既に実行されている場合は再起動しないようにします)。
run-one
プログラムを使用して、PHPスクリプトがインスタンスの複製を開始しないようにすることができます。sudo apt-get install run-one
そして、によってそれを呼び出すrun-one <normal command>
Linuxコマンドの最も創造的な 誤用の候補:
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
コマンドを実行するたびに、コマンドからの最初の画面出力が表示されます。-n 30
-コマンドを実行する間隔。この場合、30秒ごとです。--precise
-このオプションなしで、interval秒後watch
にコマンドを 実行します。これにより、可能であれば、コマンドの各開始は間隔で開始されます。このオプションがこの例で指定されていない場合、コマンドの起動と実行にかかる時間が原因で、時間が毎回30秒以上遅くなります()。 yourprog
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
。二重の「より大きい」を指定すると、以前の内容が上書きされるのではなく、各呼び出しで出力がファイルに追加されます。編集:
悪用される可能性のある別の可能性(または正当な使用法)は、システム化されたタイマーです。
cronの代替としてのsystemd / TimersおよびCron vs systemdタイマーを参照してください。
私はすぐに例を投稿しようとします。
&
により、コマンドがバックグラウンドで実行され、すぐにコマンドプロンプトに制御が戻ります。nohup
コマンドを使用すると、バックグラウンドプロセス(この場合watch
)は、端末を閉じるときなど、シェルが終了するときに送信されるハングアップ信号を無視します。...
>/dev/null
と、出力が破棄nohup.out
され、標準出力が端末の場合に作成されるファイルの作成が防止されます。
sleep
場合は、プロセスを繰り返すようにループを記述する必要があります(watch
これを繰り返しますcron
)。あなたはまだ必要があるだろうnohup
と&
。追加の問題sleep
は時間ドリフトです。これ--precise
をwatch
回避するオプション。それがなければまたは使用している場合sleep
、ループ内の各実行は後で、後で...より取得しますので、時間間隔は、コマンドやスクリプトを実行するのにかかる時間は、それに追加しました
* * * * * /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で検索して、環境に適したより良いソリューションを探してください。
without a sleep command
これは、サードパーティのソフトウェアで実行できます。
私にとってうまくいったオプションは、frequent-cronです
ミリ秒の精度が許可され、現在の実行が終了するまで次の実行を延期するオプションが提供されます。
私はいくつかの懸念があります:
(1)システムがビジーになり、30秒の時点で正確に開始できないことがあります。1つのジョブを実行しているときに別のジョブがポップし、2つ(またはそれ以上)のジョブが同じことを行う可能性があります事。スクリプトによっては、ここで重大な干渉が発生する場合があります。したがって、このようなスクリプトのコーディングには、特定のスクリプトの1つのインスタンスのみが同時に実行されるようにするためのコードが含まれている必要があります。
(2)スクリプトは、多くのオーバーヘッドを持ち、必要以上に多くのシステムリソースを消費する可能性があります。これは、他の多くのシステムアクティビティと競合している場合に当てはまります。
そのため、あるポスターが述べているように、この場合、追加のプロセスで実行するデーモンを入れて、運用上非常に重要な場合に実行を継続することを真剣に検討します。
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()を忘れないでください。