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 penghitungannya mengambil jumlah total kemungkinan dan membaginya. Anda dapat menunggangi perilaku strage-ish ini dengan menentukan rentang hari secara manual dan menggunakan jumlah hari yang 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 even-days, dan dengan menentukan secara khusus untuk membaginya seolah-olah ada 31 hari Anda dapat memaksa 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 Februari yang buruk, rentang tanggal tidak akan pernah cocok dengan satu atau dua hari terakhir, tetapi tidak ada salahnya memiliki 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 siklus tiga hari dan akhir Februari. Anda tidak dapat benar-benar menyiasati kenyataan bahwa pola reguler "setiap hari" tidak selalu akan jatuh pada hari genap atau ganjil dalam 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.
0,2,4...,30,32,34
dan itu tidak masalah, nilai di luar rentang tidak akan pernah cocok.0 0 2-30/2 * * command
0 0 2-30/2 * * command
berfungsi seperti yang diharapkan.Saya pikir kemungkinan menggunakan hari dalam setahun, seperti ini:
Ini diuji untuk sistem Unix dan Linux.
sumber
test $(($(date +%j) % 2)) == 0 && command
test $(($(date +%s) / 86400 % 2)) == 0 && command
Mari kita periksa setiap hari apakah ini "lainnya" :-) (
bc
diperlukan program)(Saya tidak yakin kode tersebut muncul dengan benar. Bagian
date +%s
ini berada di antara apostrof belakang.)sumber
Secara umum, saya akan menjalankannya setiap hari dan skrip menggunakan logika untuk menentukan apakah harus dijalankan hari ini.
Membuat file status yang sederhana memberitahu kapan terakhir kali dijalankan dan kemudian compairing akan bekerja dengan sangat mudah.
Jika perlu dijalankan melalui sumber yang berbeda, buatlah itu bergantung pada argumen.
sumber