web-dev-qa-db-ja.com

"N"分ごとにcronを実行するにはどうすればよいですか(n%5 == 1の場合)?

私はcronで5分ごとに次のような行を実行できることを知っています。

 */5 * * * * /my/script

12:00、12:05、12:10ではなく、12:01、12:06、12:11などで実行したくない場合はどうなりますか?私はこれを行うことができると思います:

 1,6,11,16,21,26,31,36,41,46,51,56 * * * * /my/script

...しかし、それは醜いです。それを行うよりエレガントな方法はありますか?

45
mike
1-56/5 * * * * /my/script

これはvixiecronで動作するはずです。他の実装についてはわかりません。

78
David Z

最初のスケジュールを使用します。

*/5 * * * * /my/script

これをスクリプトの先頭に追加します。

sleep 60

(はい、これは冗談です)

17
Sean Bright

これはかなり古いトピックですが、時間が経つにつれ、他にもいくつかのオプションがあります。その1つはcronをまったく使用せず、systemdタイマーを使用することです。これらを使用すると、他の多くのオプションとともに、秒よりも高い粒度が得られます

詳細はこちら https://wiki.archlinux.org/index.php/Systemd/Timers

たとえば、アドホックコマンドを実行するには

# systemd-run --on-calendar="*:1/5" /bin/touch /tmp/foo2
Running timer as unit run-r31335c4878f24f90b02c8ebed319ca60.timer.
Will run service as unit run-r31335c4878f24f90b02c8ebed319ca60.service.

# systemctl status run-r31335c4878f24f90b02c8ebed319ca60.timer
● run-r31335c4878f24f90b02c8ebed319ca60.timer - /bin/touch /tmp/foo2
   Loaded: loaded
Transient: yes
  Drop-In: /run/systemd/system/run-r31335c4878f24f90b02c8ebed319ca60.timer.d
           └─50-Description.conf, 50-OnCalendar.conf, 50-RemainAfterElapse.conf
   Active: active (waiting) since Wed 2017-10-25 09:05:13 UTC; 40s ago

# ls -l  /tmp/foo*
-rw-r--r-- 1 root root 0 Oct 25 09:06 /tmp/foo2

# sleep 300; ls -l  /tmp/foo*
-rw-r--r-- 1 root root 0 Oct 25 09:11 /tmp/foo2

# date; ls -l /tmp/foo2
Wed Oct 25 09:21:42 UTC 2017
-rw-r--r-- 1 root root 0 Oct 25 09:21 /tmp/foo2

編集:これらのタイプのタイマーは、関連するoncalendar行を使用して適切なサービスファイルを生成するようにしたい場合、再起動後も保持されません

0
krad