Apakah mungkin menjalankan cronjob setiap tiga hari? Atau mungkin 10 kali / bulan.
Apakah mungkin menjalankan cronjob setiap tiga hari? Atau mungkin 10 kali / bulan.
Jawaban:
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.
0 0 */3 * *
artinya run pada tanggal 1, 4, 7, dst ( */3
artinya 1-31/3
berarti 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') % 3
memiliki masalah yang sama di mana polanya dimulai ulang setiap tahun, dan tahun tidak memiliki jumlah hari yang habis dibagi 3.
* * */3 * * that says, every minute of every hour on every three days.
0 0 */3 * * says at 00:00 (midnight) every three days.
Saya bukan spesialis cron, tapi bagaimana dengan:
0 */72 * * *
Ini akan berjalan setiap 72 jam tanpa gangguan.
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.
0 0 1-30/3 * *
Ini akan berjalan setiap tiga hari mulai tanggal 1. Berikut adalah 20 jadwal lari -
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
Bagaimana tentang:
00 00 * * * every 3 days && echo test
Dimana every
naskahnya:
#!/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 */3
berjalan pada tanggal 3, 6, ... 27, 30 setiap bulan, tetapi kemudian salah setelah satu bulan memiliki hari ke-31. The every
Script hanya salah setelah akhir tahun.
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
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
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;
}
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.
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.
( 365-1 ) % 3 == 1
tapi ( 1 - 1 ) % 3 == 0
? Saya akan berpikir perhitungan yang lebih baik akan didasarkan pada jumlah hari sejak Epoch Unix.