5秒ごとに実行する必要があるスクリプトがあります。cron
毎分タスクを実行できることは知っていますが、毎秒何かを実行する方法はありますか?
sleep 5
5秒間(おそらくループ内で)一時停止)...?
5秒ごとに実行する必要があるスクリプトがあります。cron
毎分タスクを実行できることは知っていますが、毎秒何かを実行する方法はありますか?
sleep 5
5秒間(おそらくループ内で)一時停止)...?
回答:
Cronは最低1分間しか許可しません。あなたは可能性がやっていることは、あなたのタスクを実行し、その後、5秒間スリープ無限ループでシェルスクリプトを記述しています。そうすれば、タスク自体にかかる時間に応じて、タスクは5秒ごとに実行されます。
#!/bin/bash
while true; do
# Do something
sleep 5;
done
my-task.sh
上記の内容のファイルを作成し、で実行できますsh my-task.sh
。オプションでsupervisor
、システムの起動時などに起動するように、サービスとして設定できます。
あなたはおそらくやるべきではないことをやっているように聞こえます。これは間違っているように感じます。
このようにして、cron
12個のバックグラウンドプロセスを開始するスクリプトを毎分開始するジョブを作成できます。
* * * * * ~/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秒ごとに実行する必要がある地球上で何ができるでしょうか?
/media
私は、自動バックアップ用のUSBにプラグインドライブのディレクトリを...
What on EARTH
-統計、ガベージコレクション、ファイル同期、オンラインステータス、名前を付けます。
ループを使用するだけです:
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。があります。私のコマンドは迅速に実行されるため、フォアグラウンドで実行しても問題ありません。
./your-script
バックグラウンドで実行する必要があった場合(5秒間のスリープ中)、を&
ドロップすることはできますが、ドロップし;
ます。通り&
のコマンドを分離する目的を果たす、それが持っている不必要な(と明らかに許可されていない)だ;
同じ行にした後。別の方法は、ループを複数行で記述することです(その後に改行が&
あり、オプションで、do
前後done
にも改行があります)。;
after &
はタイプミスのように見えるので、削除しました。blueyed:;
本当に必要な場合は、お気軽に戻ってください。もしそうなら、説明を追加することもお勧めします。
「Vixie cron」の代替であるGNUパッケージmcronを使用できます。
http://www.gnu.org/software/mcron/manual/mcron.html#Top
「より細かい時間ポイント、つまり秒を簡単に指定できます。原則として、これはマイクロ秒まで延長できますが、実装されていません。」
mcron
sendmail
デフォルトでインストールおよびアクティブ化する必要があります。無効にする方法は?
cronの最小構成は数分で、5秒間は設定できません。秒を許可するQuartzを使用できます。http://www.quartz-scheduler.org/docs/tutorials/crontrigger.html
cactiを使用してルーターとスイッチを監視しますが、Cronは最低1分間しか許可しないため、1つのポート/デバイスがダウンしても、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設定をリロードし、タイマーユニットを有効にして起動します。
私はこの種のことを非常にうまく行っています(そして、マシンがリブートされるまで、最終結果は一度に数週間実行されました)。私が今何をしていたかについては、情報を更新してキャッシュに入れます-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'行で開始できます。
while
スクリプトを繰り返し再起動する代わりにループを使用しないのはなぜですか?