Pekerjaan cron setiap tiga hari

94

Apakah mungkin menjalankan cronjob setiap tiga hari? Atau mungkin 10 kali / bulan.

tmartin314
sumber
4
Ya, itu mungkin dan ini milik SuperUser.
berjalan setiap 3 hari tanpa memandang batas bulan dapat dilakukan dengan anakron.
ryanpattison

Jawaban:

129

Jalankan setiap tiga hari ...

0 0 */3 * *

Bagaimana tentang itu?

Jika Anda ingin menjalankannya pada hari-hari tertentu dalam sebulan, seperti tanggal 1, 4, 7, dll ... maka Anda dapat memiliki persyaratan dalam skrip Anda yang memeriksa hari saat ini di bulan tersebut.

if (((date('j') - 1) % 3))
   exit();

atau, seperti yang ditunjukkan @mario, Anda dapat menggunakan tanggal ('k') untuk mendapatkan hari dalam setahun alih-alih melakukannya berdasarkan hari dalam sebulan.

sberry
sumber
9
@whatshakin: Ini akan tergantung pada seberapa akurat Anda menginginkan "setiap tiga hari". Ini akan bekerja pada hari apa pun yang habis dibagi 3. Pada batas bulan, ini tidak akan tepat.
David
3
@whatshakin: Sintaks cronjob bahkan dijelaskan di Wikipedia: en.wikipedia.org/wiki/Cronjob
Felix Kling
4
Ini adalah hasil yang sangat tinggi di google, dan oleh karena itu akan lebih baik jika jawaban yang diterima itu benar, padahal ini tidak. Saya yakin penjelasan Tareco benar.
lynks
14
Jawabannya tidak benar karena tidak ada saran yang benar-benar menjalankan pekerjaan setiap 3 hari. 0 0 */3 * *artinya run pada tanggal 1, 4, 7, dst ( */3artinya 1-31/3berarti 1,4,7...31) sehingga gap akan semakin kecil di akhir bulan. (Ini akan berjalan 2 hari berturut-turut jika bulan sebelumnya memiliki 31 hari.) Ini date('j') % 3memiliki masalah yang sama di mana polanya dimulai ulang setiap tahun, dan tahun tidak memiliki jumlah hari yang habis dibagi 3.
cjm
8
Saya juga menganggapnya sangat disayangkan bahwa ini diterima sebagai jawaban. Saya benar-benar mencari setiap N hari, terlepas dari batas bulan (hal-hal seperti tanaman tidak peduli pada hari apa mereka mendapatkan air). Setidaknya saya pikir saya memutuskan setelah membaca semua komentar, bahwa cron timer tidak dengan sendirinya sepenuhnya mencontoh keinginan itu.
Travis Griggs
70
* * */3 * *  that says, every minute of every hour on every three days. 

0 0 */3 * *  says at 00:00 (midnight) every three days.
tareco
sumber
menghargai penjelasannya
pythonian29033
2
Ini biasanya akan menyala setiap tiga hari, tetapi dapat diaktifkan pada hari berikutnya di awal bulan
Dziamid
24

Saya bukan spesialis cron, tapi bagaimana dengan:

0 */72 * * *

Ini akan berjalan setiap 72 jam tanpa gangguan.

https://crontab.guru/#0_ / 72_ _ _

Fabio Nolasco
sumber
3
Ini lebih akurat daripada solusi yang diterima. Jawaban yang diterima akan gagal saat mengubah bulan:then at 2019-02-28 00:00:00 then at 2019-03-01 00:00:00
Akira Yamamoto
Bagaimana seseorang menghitung kapan ini akan terjadi?
Bruce Edge
2
Menurut crontab.guru ini berjalan setiap hari. Siapa yang benar?
velop
1
Nilai di kolom jam harus berada antara 0 dan 23 menurut crontab.guru dan man crontab .
harperville
1
* / 72 secara efektif sama dengan 0. Ini berlaku setiap tengah malam.
Pertempuran
19

Karena cron adalah "stateless", ia tidak dapat secara akurat mengekspresikan "frekuensi", hanya "pola" yang (tampaknya) terus menerus cocok dengan waktu saat ini.

Mengulangi pertanyaan Anda membuat ini lebih jelas: "apakah mungkin menjalankan cronjob pada pukul 00:01 setiap malam kecuali melewatkan malam yang dijalankan dalam 2 malam?" Saat cron membandingkan waktu saat ini dengan pola waktu permintaan pekerjaan, tidak mungkin cron dapat mengetahui apakah ia menjalankan pekerjaan Anda di masa lalu.

Biasanya Anda harus menghentikan acara berulang itu dan memulai ulang acara yang benar-benar baru; ini menggambarkan ekspresi yang terbatas tentang bagaimana aplikasi kalender yang rumit sekalipun merepresentasikan pola yang berulang. Dan tentu saja Kalender memiliki banyak status-- setiap acara dapat dihapus atau dijadwalkan ulang secara terpisah [di sebagian besar aplikasi kalender]).

Selanjutnya, Anda mungkin ingin melakukan pekerjaan Anda setiap malam ketiga jika berhasil , tetapi jika yang terakhir gagal, segera coba lagi, mungkin malam berikutnya (jangan menunggu 3 hari lagi) atau bahkan lebih cepat, seperti satu jam kemudian (tetapi berhenti mencoba lagi pada saat kedatangan pagi). Jelas, cron tidak mungkin mengetahui apakah pekerjaan Anda berhasil dan polanya juga tidak dapat menunjukkan jadwal "coba lagi" yang lebih sering.

APA SAJA-- Anda dapat melakukan apa yang Anda inginkan sendiri. Tulis skrip, beri tahu cron untuk menjalankannya setiap malam pada pukul 00:01. Skrip ini dapat memeriksa stempel waktu dari sesuatu * yang mencatat "pengoperasian terakhir", dan jika> 3 hari yang lalu **, lakukan tugas tersebut dan setel ulang stempel waktu "pengoperasian terakhir".

(* indikator cap waktu itu adalah sedikit status bertahan yang dapat Anda manipulasi dan periksa, tetapi cron tidak bisa)

** Berhati-hatilah dengan aritmatika waktu jika Anda menggunakan waktu jam yang dapat dibaca manusia-- dua kali setahun, beberapa hari memiliki 23 atau 25 jam dalam sehari, dan 02: 00-02: 59 terjadi dua kali dalam satu hari atau tidak pada semua. Gunakan UTC untuk menghindari ini.

Jaime Guerrero
sumber
7
0 0 1-30/3 * *

Ini akan berjalan setiap tiga hari mulai tanggal 1. Berikut adalah 20 jadwal lari -

  • 2015-06-01 00:00:00
  • 2015-06-04 00:00:00
  • 2015-06-07 00:00:00
  • 2015-06-10 00:00:00
  • 2015-06-13 00:00:00
  • 2015-06-16 00:00:00
  • 2015-06-19 00:00:00
  • 2015-06-22 00:00:00
  • 2015-06-25 00:00:00
  • 2015-06-28 00:00:00
  • 2015-07-01 00:00:00
  • 2015-07-04 00:00:00
  • 2015-07-07 00:00:00
  • 2015-07-10 00:00:00
  • 2015-07-13 00:00:00
  • 2015-07-16 00:00:00
  • 2015-07-19 00:00:00
  • 2015-07-22 00:00:00
  • 2015-07-25 00:00:00
  • 2015-07-28 00:00:00
Vishal
sumber
5
2015-07-31 00:00:00, 2015-08-01 00:00:00 ... OOPS hanya 1 hari antar-lari
Dziamid
5

Saya tidak berpikir Anda memiliki apa yang Anda butuhkan:

0 0 */3 * * ## <<< WARNING!!! CAUSES UNEVEN INTERVALS AT END OF MONTH!!

Sayangnya, * / 3 menyetel interval pada setiap n hari dalam sebulan dan tidak setiap n hari . Lihat: penjelasannya di sini . Di akhir bulan dijamin ada masalah berulang.

1st  at 2019-02-01 00:00:00
then at 2019-02-04 00:00:00 << 3 days, etc. OK
then at 2019-02-07 00:00:00
...
then at 2019-02-25 00:00:00
then at 2019-01-28 00:00:00
then at 2019-03-01 00:00:00 << 1 day WRONG
then at 2019-03-04 00:00:00
...

Menurut artikel ini , Anda perlu menambahkan beberapa modulo math ke perintah yang dijalankan untuk mendapatkan TRUE "setiap N hari". Sebagai contoh:

0 0 * * *  bash -c '(( $(date +\%s) / 86400 \% 3 == 0 )) && runmyjob.sh

Dalam contoh ini, tugas akan diperiksa setiap hari pada pukul 12:00, tetapi hanya akan dijalankan jika jumlah hari sejak 01-01-1970 modulo 3 adalah 0.

Jika Anda menginginkannya setiap 3 hari dari tanggal tertentu, gunakan format berikut:

0 0 * * *  bash -c '(( $(date +\%s -d "2019-01-01") / 86400 \% 3 == 0 )) && runmyjob.sh
Brad Cozine
sumber
3

Bagaimana tentang:

00 00  *  *   * every 3 days && echo test

Dimana everynaskahnya:

#!/bin/sh

case $2 in
    days)
        expr `date +%j` % $1 = 0 > /dev/null
        ;;

    weeks)
        expr `date +%V` % $1 = 0 > /dev/null
        ;;

    months)
        expr `date +%m` % $1 = 0 > /dev/null
        ;;
esac

Jadi itu berjalan setiap hari.

Penggunaan */3berjalan pada tanggal 3, 6, ... 27, 30 setiap bulan, tetapi kemudian salah setelah satu bulan memiliki hari ke-31. The everyScript hanya salah setelah akhir tahun.

MattBlissett
sumber
3

Anda harus mempelajari dasar-dasar crontab.

Edit cron dengan perintah crontab -elalu ⌃ (CTRL)+ Xlalu Ydan terakhir tekan ENTER (return)pada mac untuk menyimpan file. Anda dapat memeriksa crons baru telah diinstal dari bukan olehcrontab -l

File crontab memiliki lima bidang untuk menentukan menit, jam, hari dalam sebulan, bulan, dan hari dalam seminggu diikuti dengan perintah yang akan dijalankan pada interval itu.

*     *     *   *    *   command to be executed
-     -     -   -    -
|     |     |   |    |
|     |     |   |    +----- day of week (0-6) (Sunday=0)
|     |     |   +------- month (1-12)
|     |     +--------- day of month (1-31)
|     +----------- hour (0-23)
+------------- min (0-59)

* pada bidang nilai di atas berarti semua nilai hukum seperti pada tanda kurung untuk kolom tersebut.

Di sini, saya menulis posting mendetail tentangnya: Setup Cron di Unix

Ahmad Awais
sumber
1

Akan lebih mudah jika Anda mengonfigurasinya untuk hanya berjalan misalnya pada hari Senin dan Kamis, yang akan memberikan jeda 3 dan 4 hari.

Jika tidak, konfigurasikan untuk berjalan setiap hari, tetapi buat skrip cron php Anda keluar lebih awal dengan:

if (! (date("z") % 3)) {
     exit;
}
mario
sumber
0

Jika Anda ingin menjalankannya pada hari-hari tertentu dalam sebulan, seperti tanggal 1, 4, 7, dll ... maka Anda dapat memiliki persyaratan dalam skrip Anda yang memeriksa hari saat ini di bulan tersebut.

Saya pikir yang Anda butuhkan untuk ini adalah alih-alih * / 3 yang berarti setiap tiga hari, gunakan 1/3 yang berarti setiap tiga hari mulai tanggal 1 setiap bulan. jadi 7/3 berarti setiap tiga hari mulai tanggal 7 setiap bulan, dll.

Colin Hilbert
sumber
0

0 0 * * * [ $(($((tanggal +% - j- 1)) % 3)) == 0 ] && script

Dapatkan hari dalam setahun dari date, diimbangi dengan 1 untuk mulai dari 0, periksa apakah itu modulo tiga.

Penyamak
sumber
Tidakkah akan terjadi cegukan ini saat bergulir dari tahun non-kabisat ke tahun berikutnya, karena ( 365-1 ) % 3 == 1tapi ( 1 - 1 ) % 3 == 0? Saya akan berpikir perhitungan yang lebih baik akan didasarkan pada jumlah hari sejak Epoch Unix.
kmoser