解決策 1:
最もクリエイティブな候補者 誤用 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
- このオプションがない場合、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
というファイルに .二重大なりにより、以前の内容が上書きされるのではなく、呼び出しごとに出力がファイルに追加されます。
編集 :
悪用される可能性がある (または正当な使用である) 別の可能性があるのは、systemd タイマーです。
cron の代替としての systemd/Timers および Cron と systemd タイマーを参照してください。
すぐに例を投稿しようと思います.
解決策 2:
タスクを頻繁に実行する必要がある場合、cron は不適切なツールです。それほど頻繁にジョブを起動しないという事実は別として、ジョブの実行に起動間隔よりも長い時間がかかる場合、深刻な問題が発生するリスクもあります。デーモン化して永続的に実行するようにタスクを書き直し、必要に応じて cron から起動します (既に実行されている場合は再起動しないように注意してください)。
解決策 3:
Cron は 1 分ごとに起動するように設計されているため、ハッキングなしでは実行できません。たとえば、あなたが言及したようなスリープです。
解決策 4:
* * * * * /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 で検索して、環境に適したより良い解決策を見つけてください。
解決策 5:
サードパーティのソフトウェアでこれを行うことができます。
私にとってうまくいったオプションは、frequent-cron です
ミリ秒単位の精度が可能で、現在の実行が終了するまで次の実行を延期するオプションが提供されます..