5秒ごとにスクリプトを実行する方法は?


66

5秒ごとに実行する必要があるスクリプトがあります。cron毎分タスクを実行できることは知っていますが、毎秒何かを実行する方法はありますか?


3
どのような問題を解決しようとしていますか?cronが正しいソリューションであると確信していますか?
-andol

1
cronが適切なソリューションではないことは知っています。私はそれが問題ではないと言っていました。読んでください。5秒ごとにスクリプトを実行しようとしています。
myusuf3

2
申し訳ありませんが、質問が少し間違っていたと思います。それでも、正しい問題を解決しようとしているのかどうか疑問に思っています。
アンドル

5秒ごとに何かを実行する方法を探しているここに来る人々のため。代わりに、socket.ioなどのツールを使用してリアルタイムでプログラムする方法を学習することを一例として検討することを強くお勧めします。
ブランドンバーテルセン

bash sleepコマンドを発見しましたか? sleep 55秒間(おそらくループ内で)一時停止)...?
–SDsolar

回答:


64

Cronは最低1分間しか許可しません。あなたは可能性がやっていることは、あなたのタスクを実行し、その後、5秒間スリープ無限ループでシェルスクリプトを記述しています。そうすれば、タスク自体にかかる時間に応じて、タスクは5秒ごとに実行されます。

#!/bin/bash

while true; do
  # Do something
  sleep 5;
done

my-task.sh上記の内容のファイルを作成し、で実行できますsh my-task.sh。オプションでsupervisor、システムの起動時などに起動するように、サービスとして設定できます。

あなたはおそらくやるべきではないことをやっているように聞こえます。これは間違っているように感じます


PHPベースのスクレーパーで使用するために、5秒ごとに実行するcronが必要になる場合があります。
ラビッシュ・クマール

本当に間違っていると感じています。cronジョブに含めると、毎分重複したジョブが発生します。1時間後、5秒ごとに60個のジョブが開始されます。cronジョブに含めない場合、それを停止する方法を知ることができないか、cronジョブが存在することを知ることさえできないかもしれません。
SeF

35

このようにして、cron12個のバックグラウンドプロセスを開始するスクリプトを毎分開始するジョブを作成できます。

* * * * * ~/dostuff.sh

dostuff.sh

(sleep 5 && /path/to/task) &
(sleep 10 && /path/to/task) &
(sleep 15 && /path/to/task) &
(sleep 20 && /path/to/task) &
(sleep 25 && /path/to/task) &
(sleep 30 && /path/to/task) &
(sleep 35 && /path/to/task) &
(sleep 40 && /path/to/task) &
(sleep 45 && /path/to/task) &
(sleep 50 && /path/to/task) &
(sleep 55 && /path/to/task) &
(sleep 60 && /path/to/task) &

しかし、私の質問は、5秒ごとに実行する必要がある地球上ができるでしょうか?


1
私は繰り返しチェックするスクリプト作ったときまあ、これは私には便利になった/media私は、自動バックアップ用のUSBにプラグインドライブのディレクトリを...
VF1

32
What on EARTH-統計、ガベージコレクション、ファイル同期、オンラインステータス、名前を付けます。
RUX

3
ほぼリアルタイムのデータの外部APIを参照します。5秒ごとにリクエストを実行すると、すべてのページビューでリクエストを実行するよりもはるかに優れています。
セルゲイKudriavtsev

1
crontabがdostuff.shファイルを2回実行するとどうなりますか?たとえば、55秒で、スクリプトは実行されますが、まだ終了していませんが、cronはスクリプトを再度呼び出します。どうなりますか?
TomSawyer

2
これは悪いです!スクリプトが一度に複数回実行される可能性があり(たまたま5秒以上かかる場合)、アクセスされた(一時的な)ファイルでも競合状態になる可能性があります。同じことを2回同時に行うと問題が発生する可能性がある場合は、これを行わないでください!(そしてそれは通常!)
ノニームース

27

ループを使用するだけです:

while true ; do ./your-script & sleep 5; done

これは、スクリプトをバックグラウンドジョブとして開始し、5秒間スリープした後、再びループします。Ctrl-Cを使用して中止したり、の代わりに他の条件を使用したりできますtrue。たとえば! test -f /tmp/stop-my-script、ファイル/tmp/stop-my-scriptが存在しない間だけループします。


アンパサンドを含めるとbash: syntax error near unexpected token ';'、と表示されるため、取り出しました。bash 4.3.11。があります。私のコマンドは迅速に実行されるため、フォアグラウンドで実行しても問題ありません。
タイラーコリアー

1
@TylerCollier ./your-scriptバックグラウンドで実行する必要があった場合(5秒間のスリープ中)、を&ドロップすることはできますが、ドロップし;ます。通り&のコマンドを分離する目的を果たす、それが持っている不必要な(と明らかに許可されていない)だ;同じ行にした後。別の方法は、ループを複数行で記述することです(その後に改行が&あり、オプションで、do前後doneにも改行があります)。;after &はタイプミスのように見えるので、削除しました。blueyed:;本当に必要な場合は、お気軽に戻ってください。もしそうなら、説明を追加することもお勧めします。
エリアケイガン

@EliahKagan FWIW、Zsh(構文エラーなし)で動作しますが、実際には必要ありません。編集してくれてありがとう!
1

10

「Vixie cron」の代替であるGNUパッケージmcronを使用できます。

http://www.gnu.org/software/mcron/manual/mcron.html#Top

「より細かい時間ポイント、つまり秒を簡単に指定できます。原則として、これはマイクロ秒まで延長できますが、実装されていません。」


それがまさに私が探していたものです。ありがとうございました!
–SDsolar

ここに私の質問への回答として投稿してください:askubuntu.com/questions/922216 / ...あなたの答えを受け入れることができます。
–SDsolar



mcronsendmailデフォルトでインストールおよびアクティブ化する必要があります。無効にする方法は?
ihsan

2

cronの最小構成は数分で、5秒間は設定できません。秒を許可するQuartzを使用できます。http://www.quartz-scheduler.org/docs/tutorials/crontrigger.html


Quartzはオープンソースではないようです。これは正しいです?
txwikinger

オープンソース版があります。ページはありませんが、ダウンロードページに移動するだけです。フォームに記入する必要はありません。ダウンロードをクリックしてください。
コーディハーロウ

少なくとも2018のようなオープンソースであるように思わgithub.com/quartz-scheduler/quartz
dogmatic69

2

cactiを使用してルーターとスイッチを監視しますが、Cronは最低1分間しか許可しないため、1つのポート/デバイスがダウンしても、2分経過するまで警告はありません。


1
この回答を編集して、これを行う方法に関する具体的な詳細を追加することをお勧めします。(Ask Ubuntuでどのような回答が最も価値があると考えられるについての一般的なアドバイスについては、「良い回答を書くにはどうすればよいですか?」も参照してください。)
David Foerster

2

SystemDタイマーユニットを使用して、5秒ごとにサービス(必要な処理を行うようにセットアップしたサービス)をトリガーできます。

サービスユニットが呼び出されmystuff.service、インストールされているとします/etc/systemd/system(ユーザーのcrontabを交換する場合はSystemDユーザーサービスをチェックアウトします)。次に、タイマーユニットを記述して、起動時に5秒ごとにサービスを実行します。

/etc/systemd/system/mystuff.timer

[Unit]
Description=my stuff's schedule
[Timer]
OnBootSec=5
OnUnitActiveSec=5
[Install]
WantedBy=timers.target

次に、systemd設定をリロードし、タイマーユニットを有効にして起動します。


1
これが最良のソリューションです。唯一の欠点は、cronの概要と構成がはるかに簡単になることです。SystemDは苦痛であり、そのディレクトリ構造から始まります。まだ5秒間隔でベスト
ジョン

上記のスニペットは、mystuff.serviceではなく/etc/systemd/system/mystuff.timerにありませんか?
ブルックス

@ブルックス:はい、私の悪い-私の側に悪いコピー&ペースト。一定。
グス

ありがとう...私はsystemdを学んでいる間、私が狂っていないことを知ってうれしいです:)
ブルックス

1

私はこの種のことを非常にうまく行っています(そして、マシンがリブートされるまで、最終結果は一度に数週間実行されました)。私が今何をしていたかについては、情報を更新してキャッシュに入れます-10秒ごとに更新します。

#!/bin/sh

SLEEP=5

# do stuff
sleep $SLEEP

# do stuff
sleep $SLEEP

# do stuff
sleep $SLEEP

# do stuff
sleep $SLEEP

# echo and restart...
exec $0

「exec $ 0」はスクリプトを再起動しますが、実行中のスクリプトは置き換えます。最初はcrontab '@reboot'行で開始できます。


8
whileスクリプトを繰り返し再起動する代わりにループを使用しないのはなぜですか?
デビッドZ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.