it-swarm-id.com

Bagaimana saya bisa memberi tahu cron untuk menjalankan perintah setiap hari (aneh / genap)

Saat mengkonfigurasi cron untuk menjalankan perintah setiap hari menggunakan bidang "Day of Month", seperti:

1 22 */2 * * COMMAND

itu berjalan setiap kali hari dalam bulan ganjil: 1,3,5,7,9 dan seterusnya.

Bagaimana saya dapat mengkonfigurasi cron untuk berjalan pada hari-hari dalam bulan yang bahkan seperti 2,6,8,10 dan seterusnya (tanpa menentukan secara harfiah, yang bermasalah karena setiap bulan memiliki jumlah hari yang berbeda dalam sebulan)?

46
freddie

Sintaks yang Anda coba sebenarnya ambigu. Tergantung pada berapa hari dalam sebulan, beberapa bulan itu akan berjalan pada hari-hari ganjil dan beberapa di genap. Ini karena cara perhitungannya mengambil jumlah total kemungkinan dan membaginya. Anda dapat mengganti perilaku strage-ish ini dengan secara manual menentukan rentang hari dan menggunakan jumlah hari ganjil atau genap. Karena bahkan skrip harian tidak akan pernah berjalan pada hari ke-31 dari bulan yang lebih lama, Anda tidak kehilangan apa pun menggunakan 30 hari sebagai basis untuk hari-genap, dan dengan menentukan secara khusus untuk membaginya seolah-olah ada 31 hari Anda dapat memaksa ganjil Eksekusi -hari.

Sintaksnya akan terlihat seperti ini:

# Will only run on odd days:
0 0 1-31/2 * * command

# Will only run on even days:
0 0 2-30/2 * * command

Kekhawatiran Anda tentang bulan yang tidak memiliki jumlah hari yang sama tidak penting di sini karena tidak ada bulan yang memiliki LEBIH BANYAK hari daripada ini, dan untuk orang miskin Februari, rentang tanggal tidak akan pernah cocok dengan satu atau dua hari terakhir, tetapi itu tidak akan membahayakan setelah terdaftar.

Satu-satunya 'gotcha' untuk pendekatan ini adalah bahwa jika Anda berada pada siklus hari ganjil, bulan berikutnya dengan 31 hari perintah Anda juga akan berjalan pada bulan pertama bulan itu. Demikian juga jika Anda memaksakan siklus genap, setiap tahun kabisat akan menyebabkan satu siklus tiga hari pada akhir Februari. Anda tidak dapat benar-benar menyiasati kenyataan bahwa pola reguler "setiap hari" tidak selalu akan jatuh pada hari genap atau ganjil di setiap bulan dan dengan cara apa pun Anda memaksakan ini, Anda akan memiliki perpanjangan tambahan atau kehilangan batas antara bulan dengan jumlah hari yang tidak cocok.

64
Caleb

Saya pikir kemungkinan menggunakan hari dalam setahun, seperti ini:

# for odd days
test $(((`date +%j` % 2))) != 0 && command

# for even days
test $(((`date +%j` % 2))) == 0 && command

Ini diuji untuk sistem Unix dan Linux.

2
Jordi

Secara umum, saya akan menjalankannya setiap hari dan skrip menggunakan logika untuk menentukan apakah harus dijalankan hari ini.

Membuat file status dengan mudah memberitahukan kapan terakhir kali dijalankan dan kemudian compairing akan bekerja dengan sangat mudah.

Jika perlu dijalankan melalui sumber yang berbeda, buatlah itu bergantung pada argumen.

1
Klas Mattsson

Mari kita periksa setiap hari apakah ini merupakan program "lain" :-) (bc diperlukan)

0 0 * * * test $(echo `date +%s` / 86400 % 2 == 0 |bc) -eq 0 && command

(Saya tidak yakin kode muncul dengan benar. Bagian date +%s Berada di antara tanda kutip belakang.)

1
user37264