Cronjob dijalankan setiap dua minggu, pada hari Sabtu, dimulai pada hari Sabtu ini

11

Hari ini adalah Jumat, 3 Oktober 2014 3:58

Saya ingin menjadwalkan cronjob seperti itu untuk menjalankannya pada tanggal berikut:

  1. Sabtu, 4 Oktober 2014, 8:00 pagi
  2. Sabtu, 18 Oktober 2014 08.00
  3. Sabtu, 1 November 2014, 8:00 pagi ... ...

Jadi setiap 2 minggu, pada hari Sabtu, jam 8 malam.

kupa
sumber

Jawaban:

27
0 8 * * 6 test $((10#$(date +\%W)\%2)) -eq 1 && yourCommand

date +%W: jumlah minggu tahun dengan Senin sebagai hari pertama dalam minggu, hari ini minggu ke 39

10#$(date +%W): konversikan date +Wke angka desimal dan hindari kebingungan parsing dasar shell

$((39%2)): operasi modulo: hasilnya 0 (angka minggu genap) atau 1 (angka minggu ganjil), hasil minggu ini adalah 1, minggu depan 0

test 1 -eq 1: tes aritmatika (sama), dalam hal ini hasilnya adalah boolean true

&& yourCommand: Boolean AND: jalankan yourCommandhanya jika hasil dari perintah sebelumnya adalah boolean true

Perhatikan bahwa tahun ini bisa mendapatkan dua minggu ganjil: 53 (tahun ini) dan 1 (tahun depan)

Cyrus
sumber
2
Itu elegan! Masih, seperti yang telah Anda catat, memiliki sudut pada Sabtu ke-53 tahun ini, yang akan terjadi kira-kira tujuh puluh tahun dalam setiap empat abad.
MadHatter
@Cyrus terima kasih atas jawaban Anda, tetapi jika saya menulis * * * * 5 tes $ (($ (tanggal +% W)% 2)) -eq 1 && /u02/restore/scripts/test.sh skrip tidak jalankan tetapi jika saya menulis skrip * * * * 5 /u02/restore/scripts/test.sh dijalankan. mengapa ekspresimu tidak berfungsi? Saya hanya menguji kasus-kasus itu. Dan ternyata tidak berhasil.
kupa
1
Kesalahanku. Cron mengartikan% sebagai baris baru. Lepaskan kedua% dengan \ di cronjob Anda:0 8 * * 6 test $(($(date +\%W)\%2)) -eq 1 && yourCommand
Cyrus
Maaf untuk membawa kembali pertanyaan lama ini tapi itu tidak bekerja untuk saya dan ketika saya mencoba untuk mengeksekusi $((10#$(date +%W)%2)) -eq 1 && echo OKmencoba shell saya untuk mengeksekusi hasil perhitungan minggu: -bash: 1: command not found. Adakah petunjuk mengapa ia melakukan itu? Terima kasih.
jhuet
3
@ jhuet: testbukan pengguna, itu perintah. Coba:test $((10#$(date +\%W)%2)) -eq 1 && echo odd || echo even
Cyrus
4

Apa yang Anda tunjukkan adalah "setiap minggu". Maka kodenya adalah:

0 8 * * 6

Anda yakin perlu menjalankannya setiap dua minggu?

0 8 * * 6 expr `date +\%s` / 604800 \% 2 >/dev/null || yourCommand
Glueon
sumber
1
Tolong jelaskan perintahnya
kupa
1
Lebih baik menggunakan apa yang Cyrus berikan - $ (($ (tanggal +% W)% 2)) "W" adalah nomor minggu dalam setahun. Mulai dari nol hingga 53. Jika bisa dibagi dua, maka itu adalah minggu "setiap detik" Anda. Jadi cronjob berjalan setiap minggu tetapi 'expr' mengeksekusi perintah yourCommand hanya jika angka minggu dapat dibagi dengan 2.
Glueon
ketika saya menjalankan tes $ (($ (tanggal +% W)% 2)) -eq 1 pada baris perintah tidak menghasilkan apa-apa, mengapa?
kupa
1
jalankan saja echo $?setelah menjalankan perintah itu, untuk melihat kode kembalinya - itulah yang penting dengan itu
Ale