web-dev-qa-db-ja.com

30秒ごににクーロンを実行する

わかりましたので、30秒ごとに実行する必要があるクーロンがあります。

これは私が持っているものです:

*/30 * * * * /bin/bash -l -c 'cd /srv/last_song/releases/20120308133159 && script/Rails runner -e production '\''Song.insert_latest'\'''

実行されますが、これは30分または30秒ごとに実行されていますか?

また、私はcronを頻繁に実行すると使用するのに最適なツールではないかもしれないと読んでいます。 Ubuntu 11.04で使用またはインストールできる他のより良いツールはありますか。上記のcronを修正する方法はありますか?

237
Matt Elhotiby

minutes 指定子には*/30があります。つまり、毎分30ステップの間隔で(つまり30分ごとに)なります。 cronは分以下の解像度には達しないので、別の方法を見つける必要があります。

1つの可能性は、少々おかしなことですが、2つのジョブを持つことです。1つは30秒のオフセットです。

* * * * * /path/to/executable param1 param2
* * * * * ( sleep 30 ; /path/to/executable param1 param2 )

両方の cron ジョブは実際には毎分実行されますが、後者はジョブの「肉」である/path/to/executableを実行する前に30分待機します。

612
paxdiablo

できません。 Cronには60秒の精度があります。

* * * * * cd /srv/last_song/releases/20120308133159 && script/Rails runner -e production '\''Song.insert_latest'\''
* * * * * sleep 30 && cd /srv/last_song/releases/20120308133159 && script/Rails runner -e production '\''Song.insert_latest'\''
57
wildplasser

Cronの粒度は数分であり、 ではありません 何かを実行するためにx秒ごとに起動するように設計されていません。繰り返し作業をループ内で実行すると、必要なことを実行できます。

#!/bin/env bash
while [ true ]; do
 sleep 30
 # do what you need to here
done
35
Marvin Pinto

2つのcronエントリは必要ありません。次のコマンドで1つにまとめることができます。

* * * * * /bin/bash -l -c "/path/to/executable; sleep 30 ; /path/to/executable"

だからあなたの場合:

* * * * * /bin/bash -l -c "cd /srv/last_song/releases/20120308133159 && script/Rails runner -e production '\''Song.insert_latest'\'' ; sleep 30 ; cd /srv/last_song/releases/20120308133159 && script/Rails runner -e production '\''Song.insert_latest'\''"

22
Andrew

この同じような質問への私の答えをチェックすることができます

基本的に、1分ごとにcronで実行し、実行したい実際のコマンドと実行したい秒数を引数として渡すことができる "runEvery.sh"という名前のbashスクリプトがあります。

このようなもの

* * * * * ~/bin/runEvery.sh 5 myScript.sh

11
shlomia

Cronジョブを使用して、秒単位でジョブをスケジュールすることはできません。つまり、5秒ごとにcronジョブを実行するようにスケジュールすることはできません。代わりの方法は、その中にsleep 5コマンドを使用するシェルスクリプトを書くことです。

次に示すように、bash whileループを使用して、シェルスクリプトevery-5-seconds.shを作成します。

$ cat every-5-seconds.sh
#!/bin/bash
while true
do
 /home/ramesh/backup.sh
 sleep 5
done

それでは、次に示すようにNohupを使用してこのシェルスクリプトをバックグラウンドで実行します。セッションからログアウトした後も、これはスクリプトを実行し続けます。これにより、5秒ごとにbackup.shシェルスクリプトが実行されます。

$ Nohup ./every-5-seconds.sh &
9
Pankaj Shinde

時計を使う:

$ watch --interval .30 script_to_run_every_30_sec.sh
7
user7079817

/etc/cron.d/ディレクトリに

newファイルを作成するexcute_per_30s

* * * * * yourusername  /bin/date >> /home/yourusername/temp/date.txt
* * * * * yourusername sleep 30; /bin/date >> /home/yourusername/temp/date.txt

30秒ごとにcronを実行します

6
lingyfh

Fcron( http://fcron.free.fr/ )を使用すると、cron(vixie-cron)よりも安定しているため、秒単位の細かさと優れた機能が得られます。私は愚かな設定で1台のマシン上で約60のphpスクリプトを実行させるなどの愚かなことをしていましたが、それでもその仕事はしました!

5
Adi Chiru

最近のSystemDでLinux OSを実行している場合は、SystemD Timerユニットを使用してスクリプトを任意の粒度レベル(理論的にはナノ秒まで)で実行できます。また、必要に応じてCronよりもはるかに柔軟な起動規則。sleepの追加作業は不要

Cronファイルに単一行を設定するよりも少し時間がかかりますが、「毎分」以上のものが必要な場合は、その努力に値するものです。

SystemDタイマーモデルは基本的には - タイマーはタイマーが経過したときにサービスユニットを開始するユニットですです。

ですから、スケジュールしたいスクリプトやコマンドごとに、サービスユニットとそれに続く追加のタイマーユニットが必要です。 1つのタイマーユニットに複数のスケジュールを含めることができるため、通常は複数のタイマーと1つのサービスを必要としません。

これは、10秒ごとに「Hello World」と記録する簡単な例です。

/etc/systemd/system/helloworld.service

[Unit]
Description=Say Hello
[Service]
ExecStart=/usr/bin/logger -i Hello World

/etc/systemd/system/helloworld.timer

[Unit]
Description=Say Hello every 10 seconds
[Timer]
OnBootSec=10
OnUnitActiveSec=10
AccuracySec=1ms
[Install]
WantedBy=timers.target

これらのユニットを設定した後(システム全体の設定の場合は前述のように/etc/systemd/systemで、ユーザー固有の設定の場合は~/.config/systemd/userで)、systemctl enable helloworld.timerを実行してタイマーを有効にする必要があります。 (再起動後にタイマーが起動するのを待つのではなく)直ちにタイマーを起動する場合は、systemctl start helloworld.timerも実行します。

ここで使用されている[Timer]セクションのフィールドは次のとおりです。

  • OnBootSec - 各起動の数秒後にサービスを開始します。
  • OnUnitActiveSec - サービスが最後に開始されてから数秒後にサービスを開始します。これが、タイマーがそれ自体を繰り返し、クーロン・ジョブのように振る舞う原因となります。
  • AccuracySec - タイマーの精度を設定します。タイマーはこのフィールドが設定するのと同じくらい正確であり、デフォルトは1分です(cronをエミュレートします)。最高の精度を要求しない主な理由は、電力消費を改善することです - SystemDが他のイベントと一致するように次の実行をスケジュールできる場合は、CPUを頻繁に起こす必要はありません。上記の例の1msは理想的ではありません - 私は通常、分以下のスケジュールされたジョブで1(1秒)に精度を設定します、しかしそれはあなたが「Hello World」メッセージを示すログを見るなら、あなたが1秒遅れることがよくあります。それで問題なければ、精度を1秒以上に設定することをお勧めします。

お気づきかもしれませんが、このタイマーはCronにそんなによく似ていません - つまり、コマンドがすべてのウォールクロックの開始時に開始されないという意味で(つまり、クロックの10秒以降に開始されません)。その後20日など)。代わりに、タイマーが切れたときに起こるだけです。システムが12:05:37に起動した場合、次にコマンドが実行されるのは12:05:47、その後12:05:57などになります。実際の壁時計の精度に興味がある場合は、 OnBootSecフィールドとOnUnitActiveSecフィールドを置き換えて、代わりにOnCalendarルールを希望のスケジュールに設定します(私の知る限りでは、カレンダー形式を使用して1秒を超えることはできません)。上記の例は次のように書くこともできます。

OnCalendar=*-*-* *:*:00,10,20,30,40,50

最後の注意:ご想像のとおり、helloworld.timerユニットは同じ名前(ユニットタイプの接尾辞を除く)を持つのでhelloworld.serviceユニットを開始します。これがデフォルトですが、[Timer]セクションのUnitフィールドを設定することでこれをオーバーライドできます。

よりゴージャスな詳細は以下にあります。

5
Guss

Crontabジョブは、数分/数時間/数日でジョブをスケジュールするために使用できますが、秒単位ではスケジュールできません。代替案:

30秒ごとに実行するスクリプトを作成します。

#!/bin/bash
# 30sec.sh

for COUNT in `seq 29` ; do
  cp /application/tmp/* /home/test
  sleep 30
done

このスクリプトを実行するには、crontab -eとcrontabを使用します。

* * * * * /home/test/30sec.sh > /dev/null
4
szaier

良い答えをありがとうございました。それを簡単にするために、crontabのコントロールとスクリプトの時分割を持つ混合ソリューションが好きでした。だからこれは私が20秒ごとにスクリプトを実行するためにしたことです(毎分3回)。クロンタブライン:

 * * * * 1-6 ./a/b/checkAgendaScript >> /home/a/b/cronlogs/checkAgenda.log

スクリプト:

cd /home/a/b/checkAgenda

Java -jar checkAgenda.jar
sleep 20
Java -jar checkAgenda.jar 
sleep 20
Java -jar checkAgenda.jar 
1
jfajunior

frequent-cron をご覧ください。古いですが非常に安定しており、マイクロ秒までステップダウンできます。この時点で、私がそれに対して言う唯一のことは、init.dの外にそれをインストールする方法をまだ試しているが、ネイティブsystemdサービスとしてですが、確かにUbuntu 18までは実行されているだけです引き続きinit.dを使用して問題ありません(距離は後のバージョンで異なる場合があります)。前のインスタンスが完了しない限り、PHPスクリプトの別のインスタンスが生成されないことを保証するという追加の利点(?)があり、潜在的なメモリリークの問題が軽減されます。

0
bnoeafk

私は次のような方法でそれを実行するための同様の作業をしました。

Nohup watch -n30 "kill -3 NODE_PID" &

私は30秒毎に数時間の間-3(プログラムのスタックトレースを取得するために)定期的なkill -3を行う必要がありました。

Nohup ... & 

これは、シェルを失ってもwatchの実行が失われないようにするためです(ネットワークの問題、windowsのクラッシュなど)。

0
Thomas

シェルスクリプトを作成して.shファイルを作成する

ナノevery30second.sh

スクリプトを書いて

#!/bin/bash
For  (( i=1; i <= 2; i++ ))
do
    write Command here
    sleep 30
done

その後、このスクリプトにcronを設定します。 crontab -e

(* * * * * /home/username/every30second.sh)

このcronは1分ごとに.shファイルを呼び出し、.shファイルコマンドでは1分に2回実行されます。

5秒間スクリプトを実行する場合は、30を5に置き換えて、ループを次のように変更します。For (( i=1; i <= 12; i++ ))

あなたが任意の秒を選択したら60 /あなたの秒を計算してForループを書く

0
Aditya Gosavi

現在私は以下の方法を使用しています。問題なく動作します。

* * * * * /bin/bash -c ' for i in {1..X}; do YOUR_COMMANDS ; sleep Y ; done '

_ n _ 秒ごとに実行したい場合は、 _ x _ 60/N _ y _ _ n _ になります。

ありがとうございました。

0
sujoshi