Bagaimana cara menjadwalkan cronjob dua mingguan?

10

crontab (5) mendefinisikan bidang-bidang berikut:

       field         allowed values
       -----         --------------
       minute        0-59
       hour          0-23
       day of month  1-31
       month         1-12 (or names, see below)
       day of week   0-7 (0 or 7 is Sun, or use names)

dan menjelaskan:

 Step values can be used in conjunction with ranges.  Following a range
 with ``/<number>'' specifies skips of the number's value through the
 range.  For example, ``0-23/2'' can be used in the hours field to specify
 command execution every other hour (the alternative in the V7 standard is
 ``0,2,4,6,8,10,12,14,16,18,20,22'').

Jadi, tidak ada Pekerjaan dua mingguan, sejauh pemahaman saya pergi. Saya cukup yakin ada solusinya, apa milik Anda? Atau apakah saya melewatkan sesuatu?

Roma
sumber
2
Jawaban terbaik yang dapat saya temukan mengenai hal ini ada di sini: unix.stackexchange.com/questions/1224/…
Somantra
... dan jawaban-jawaban pada U&L akan menjadi cara saya melakukannya, @Somantra :-)
voretaq7
@ voretaq7, saya akan mengatakan bahwa itu adalah jawaban kanonik, tetapi saya tidak ingin dianggap sebagai orang yang luar biasa ;-)
Somantra

Jawaban:

8

Anda dapat membuat hal dijalankan oleh cron setiap hari Rabu, kemudian biarkan hal dijalankan memutuskan apakah itu minggu yang genap atau minggu yang aneh. sebagai contoh:

#!/bin/bash
week=$(date +%U)
if [ $(($week % 2)) == 0 ]; then 
    echo even week
else 
    echo odd week
fi
rebus
sumber
Ini adalah solusi yang bagus, namun, tidak benar-benar menjawab pertanyaan itu sendiri - saya lebih suka untuk tidak mencemari masalah dengan logika jadwal. Mungkin saya bisa mengintegrasikan ini dengan tautan yang diberikan @Somantra.
Roman
Baiklah, saya harus akui: ini adalah solusi terbaik sejauh ini. Tautan yang diberikan @Somantra mencapai hasil yang sama dengan IMHO kompleks yang tidak perlu (dihitung dengan waktu UNIX), tetapi menambahkan pendekatan Anda langsung ke cronjob (alih-alih ke dalam skrip) dengan gaya yang sama membuatnya cukup elegan.
Roman
Ini rusak pada tahun 2020 karena memiliki 53 minggu. Mis: Jika cron Anda dijadwalkan berjalan dua mingguan pada tanggal 31 Desember, cron Anda akan berjalan pada tanggal 31 Desember 2020 (minggu ke-53) dan 4 Januari, 2020 (minggu ke-1).
mad_fox
4

Banyak crons (Anda tidak menentukan yang Anda gunakan) rentang dukungan. Jadi sesuatu seperti itu

0 0 1-7,15-21 * 3

Akan mencapai hari Rabu pertama dan ketiga bulan ini.

quadruplebucky
sumber
ini sedikit lebih elegan daripada metode "lakukan dalam skrip", tapi ingat untuk menambahkan komentar ke crontab Anda (aturan umum: jika Anda memiliki lebih dari satu -atau /terlibat, mungkin ada baiknya berkomentar untuk menggambarkan jadwal)
voretaq7
Saya curiga ini salah; itu akan menyebabkan pekerjaan dijalankan pada tanggal 1 - 7, dan 15-21, setiap bulan, dan setiap hari Rabu juga. Ini dari man 5 crontab: " Hari pelaksanaan perintah dapat ditentukan oleh dua bidang - hari dalam sebulan, dan hari dalam seminggu. Jika kedua bidang dibatasi (yaitu, bukan *), perintah akan dijalankan ketika salah satu bidang cocok dengan waktu saat ini. Misalnya, "30 4 1,15 * 5" akan menyebabkan perintah dijalankan pada pukul 4:30 pagi pada tanggal 1 dan 15 setiap bulan, ditambah setiap hari Jumat "(penekanan saya).
MadHatter
1
Sebenarnya, itu tergantung pada cron daemon yang Anda gunakan. Entri Anda tampaknya berasal dari vixie cron (termasuk dalam distro RedHat). Dari "man crontab" pada cron dillo's (Slackware): Jika Anda menentukan satu hari dalam sebulan dan satu hari dalam seminggu, * itu akan ditafsirkan sebagai Nth seperti hari di bulan *. Namun, solusi yang ditulis (menghitung jumlah minggu) sepertinya satu-satunya solusi portabel.
AlvaroGMJ
2

Untuk sesuatu yang perlu dijalankan setiap minggu gunakan one-liner ini:

0 0 * * 5 [ `expr \`date +\%V\` \% 2` -eq 0 ] && echo "execute script" 

Skrip khusus ini dijadwalkan untuk tayang pada hari Jumat. Minggu yang akan dieksekusi dapat disesuaikan dengan menggunakan "-eq 0" atau "-eq 1"

AlexY
sumber
1

Anacron adalah solusi yang baik untuk keterbatasan cron.

  • Anacron memiliki parameter Periode Perulangan yang dapat Anda atur menjadi 14.

periode penundaan perintah pengidentifikasi pekerjaan

14 15 test.daily /path/to/script.sh

Somantra
sumber
Sayangnya, anacron tidak dapat digunakan. Lupa menyebutkan itu.
Roman
1

Jika kebutuhan Anda bukan dua mingguan, Anda bisa menjalankan cronjob pada tanggal 1 dan 15 bulan ini:

15 8 1,15 * * /your/script.sh

Yang berjalan pada pukul 8:15 pagi pada tanggal pertama dan kelima belas setiap bulan terlepas dari hari dalam seminggu.

Chris Brewer
sumber
-2

Dari penjelasan pengaturan 3/2 di bidang minggu harus menjalankan tugas pada setiap hari Rabu lainnya - yang tersirat, tapi saya pikir bisa dilakukan.

Journeyman Geek
sumber
tidak, ini sama dengan for(int i=3; i <=3 ; i+=2) {} karena hanya melalui sekali ini, tidak masalah jika "langkah" adalah 1 atau 2.
semur
Apa yang dikatakan @stew. Juga, tidak ada "bidang minggu".
Roman
Dengan bidang minggu, maksudku "Hari bidang minggu '
Journeyman Geek