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.
@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.
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.
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?
* / 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.
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:
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.
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.
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.
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.
Jawaban:
Jalankan setiap tiga hari ...
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.
atau, seperti yang ditunjukkan @mario, Anda dapat menggunakan tanggal ('k') untuk mendapatkan hari dalam setahun alih-alih melakukannya berdasarkan hari dalam sebulan.
sumber
0 0 */3 * *
artinya run pada tanggal 1, 4, 7, dst (*/3
artinya1-31/3
berarti1,4,7...31
) sehingga gap akan semakin kecil di akhir bulan. (Ini akan berjalan 2 hari berturut-turut jika bulan sebelumnya memiliki 31 hari.) Inidate('j') % 3
memiliki masalah yang sama di mana polanya dimulai ulang setiap tahun, dan tahun tidak memiliki jumlah hari yang habis dibagi 3.sumber
Saya bukan spesialis cron, tapi bagaimana dengan:
Ini akan berjalan setiap 72 jam tanpa gangguan.
https://crontab.guru/#0_ / 72_ _ _
sumber
then at 2019-02-28 00:00:00 then at 2019-03-01 00:00:00
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.
sumber
Ini akan berjalan setiap tiga hari mulai tanggal 1. Berikut adalah 20 jadwal lari -
sumber
Saya tidak berpikir Anda memiliki apa yang Anda butuhkan:
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.
Menurut artikel ini , Anda perlu menambahkan beberapa modulo math ke perintah yang dijalankan untuk mendapatkan TRUE "setiap N hari". Sebagai contoh:
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:
sumber
Bagaimana tentang:
Dimana
every
naskahnya:Jadi itu berjalan setiap hari.
Penggunaan
*/3
berjalan pada tanggal 3, 6, ... 27, 30 setiap bulan, tetapi kemudian salah setelah satu bulan memiliki hari ke-31. Theevery
Script hanya salah setelah akhir tahun.sumber
Anda harus mempelajari dasar-dasar
crontab
.Edit cron dengan perintah
crontab -e
lalu ⌃ (CTRL)+ Xlalu Ydan terakhir tekan ENTER (return)pada mac untuk menyimpan file. Anda dapat memeriksa crons baru telah diinstal dari bukan olehcrontab -l
*
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
sumber
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:
sumber
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.
sumber
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.sumber
( 365-1 ) % 3 == 1
tapi( 1 - 1 ) % 3 == 0
? Saya akan berpikir perhitungan yang lebih baik akan didasarkan pada jumlah hari sejak Epoch Unix.