毎分よりも頻繁にcronジョブを実行できますか?


44

sleepコマンドなしで30秒ごとにcronジョブを実行することは可能ですか?


4
あなたの意図は何ですか?cronはこれに使用する適切なツールですか?
マヌエルフェイク

良い質問。
プリエサンガ

たとえば、私は現在cronを使用してデスクトップの背景画像を変更し、ネイティブの背景画像スイッチャーの制限を回避しています(サブディレクトリに飛び込むことはありません)。1分間に1回より頻繁に切り替える場合、このcronの制限にぶつかります。(ネイティブBGスイッチャは同じ制限を有しているが)
donquixote

回答:


36

タスクを頻繁に実行する必要がある場合、cronは間違ったツールです。ジョブを頻繁に起動しないという事実はさておき、ジョブの起動間隔よりもジョブの実行に時間がかかると、深刻な問題が発生する危険もあります。デーモン化して永続的に実行するようにタスクを書き直し、必要に応じてcronから起動します(既に実行されている場合は再起動しないようにします)。


18
「ジョブの起動間隔よりもジョブの実行に時間がかかると、深刻な問題が発生するリスクもあります。」それは真実ではなく、その場合、5分ごと、1時間ごと、または1か月ごとに実行されるジョブに等しく適用されます。この問題には解決策があります(pidfileなどを使用して、ジョブを実行する前にジョブが既に実行されているかどうかを確認します)。そのため、問題はcronがその頻度を許可しないだけであるが、1分未満ごとにタスクを実行することに本質的に問題があると言うのは誤りです。
マッテオ

2
pidfileを使用しない場合を意味します。ジョブがX分ごとに実行され、終了するのにX分以上かかる場合、ジョブが積み重なってしまいます。ジョブが何らかのリソース(CPU、ネットワーク/ディスクの帯域幅など)によっても制限されている場合、一度に実行すると、完了するまでにさらに時間がかかり、最終的にコンピューターが混乱状態になります。
夕暮れ

2
run-oneプログラムを使用して、PHPスクリプトがインスタンスの複製を開始しないようにすることができます。sudo apt-get install run-oneそして、によってそれを呼び出すrun-one <normal command>
kouton

3
さらに下の答えが示すように、それは少しハックですが、非常に可能です。なぜあなたは間違っているのですか!!!! ここで受け入れられた答えは、質問にまったく答えられないときですか?
誰か

@Mantriur質問の作者がそれを助けて、受け入れられた答えとしてマークしたので?:)しかし、真剣に、あなたはすでにあなた自身で問題を特定しました:他の現代的な答えの多くは、実稼働システムで使用するのが賢明ではないハック的な解決策を提案しました。(また、他のいくつかの回答は質問が出されてから数年後に現れたため、まだ受け入れることができなかったことに
留意し

37

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-このオプションなしでintervalwatchにコマンド 実行します。これにより、可能であれば、コマンドの各開始は間隔で開始さます。このオプションがこの例で指定されていない場合、コマンドの起動と実行にかかる時間が原因で、時間が毎回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タイマーを参照してください。

私はすぐに例を投稿しようとします。


6
私は純粋な頬に+1を与えています
マット・シモンズ

2
この回答でもう少し説明があればいいと思います。nohupコマンドは私にとって新しいものです。インターネットは、ハングアップ信号を無視することだと言っています。まだ混乱しています。
ドンキホーテ

2
@donquixote:私の答えのコマンド全体が推奨されるものではないことを認識することが重要です。したがって、「誤用」という言葉を使用します。ただし、有用なテクニックが含まれているため、少しわかりやすくするために、いくつかを説明します。これ&により、コマンドがバックグラウンドで実行され、すぐにコマンドプロンプトに制御が戻ります。nohupコマンドを使用すると、バックグラウンドプロセス(この場合watch)は、端末を閉じるときなど、シェルが終了するときに送信されるハングアップ信号を無視します。...
デニスウィリアムソン

1
...を使用して出力をリダイレクトする>/dev/nullと、出力が破棄nohup.outされ、標準出力が端末の場合に作成されるファイルの作成が防止されます。
デニスウィリアムソン

1
@donquixote:30秒ごとに、今から30秒だけではありません。残りは、cronのようにバックグラウンドで無人で実行することです。を使用するsleep場合は、プロセスを繰り返すようにループを記述する必要があります(watchこれを繰り返しますcron)。あなたはまだ必要があるだろうnohup&。追加の問題sleepは時間ドリフトです。これ--precisewatch回避するオプション。それがなければまたは使用している場合sleep、ループ内の各実行は後で、後で...より取得しますので、時間間隔は、コマンドやスクリプトを実行するのにかかる時間は、それに追加しました
デニス・ウィリアムソン

13

Cronは1分ごとに起動するように設計されているため、たとえば前述のように睡眠など、何らかのハッキングなしで実行することはできません。


10
* * * * * /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
フィリップ

10
この質問を見つけた他の訪問者は、sleepコマンドが使用されているかどうかは気にしません:)
donquixote

8

これは、サードパーティのソフトウェアで実行できます。

私にとってうまくいったオプションは、frequent-cronです

ミリ秒の精度が許可され、現在の実行が終了するまで次の実行を延期するオプションが提供されます。


1
Frequent-cronは私たちにとってもうまく機能しており、私たちの生産システムの多くを支えています。これまでに問題が発生したことはありません。
ホーマー6

2

私はいくつかの懸念があります:

(1)システムがビジーになり、30秒の時点で正確に開始できないことがあります。1つのジョブを実行しているときに別のジョブがポップし、2つ(またはそれ以上)のジョブが同じことを行う可能性があります事。スクリプトによっては、ここで重大な干渉が発生する場合があります。したがって、このようなスクリプトのコーディングには、特定のスクリプトの1つのインスタンスのみが同時に実行されるようにするためのコードが含まれている必要があります。

(2)スクリプトは、多くのオーバーヘッドを持ち、必要以上に多くのシステムリソースを消費する可能性があります。これは、他の多くのシステムアクティビティと競合している場合に当てはまります。

そのため、あるポスターが述べているように、この場合、追加のプロセスで実行するデーモンを入れて、運用上非常に重要な場合に実行を継続することを真剣に検討します。


1

このタスクのための私の最も簡単でお気に入りのソリューション:

cronエントリ:
* * * * * flock -w0 /path/to/script /path/to/script

脚本:
while true;do echo doing something; sleep 10s;done

怠zyな選択肢::)

* * * * * 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インストールで使用可能です

短所

  • この種の「サービス」の停止には2つのステップが必要です
    • cronエントリをコメントアウトします
    • スクリプトまたはwatchコマンドを強制終了します

2
誰かがこれをLinux初心者に長所と短所で説明できますか?ありがとう..
a20

@asvanyこのソリューションは気に入ったと思いますが、a20として、Linuxの「グリーン」に関する説明をお願いします。ty。
JoelAZ

0

独自のスクリプト用である場合、またはラップできる場合の解決策:

  1. 開始時刻を取得して記憶します。
  2. 後で触れるロックファイルが存在し、スクリプトが60秒間実行されていない場合は、1秒待ってからもう一度確認します。(例えば、while / sleep)*
  3. 60秒が経過してもロックファイルがまだ存在する場合は、古いロック警告で終了します。
  4. ロックファイルをタッチします。
  5. スクリプトが60秒間実行されていない間、目的のスリープ期間で実際のタスクをループします。
  6. ロックファイルを削除します。
  7. 細かいcronとして追加します。
  8. ボブはあなたのおじです。

デーモンを構築して監視するよりも頭痛が少ない。

* PHPを使用している場合は、clearstatcache()を忘れないでください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.