Cron tidak berjalan pada hari tertentu tetapi semua hari lainnya

8

Saya memiliki pengaturan cron untuk menjalankan skrip bash setiap hari pada jam 10 malam. Saya memiliki pengaturan cron lain untuk dijalankan setiap bulan pada tanggal 1 bulan itu. Kedua crons meluncurkan skrip bash, dan satu-satunya yang berbeda dalam skrip bash adalah argumen yang mereka sampaikan ke program java yang mendasarinya (meniru peluncuran baris perintah dari program java).

Masalahnya adalah, saya perlu menonaktifkan cron harian pada tanggal 1 bulan sehingga keduanya tidak mencoba berjalan pada hari yang sama. Apakah ini mungkin dilakukan secara otomatis?

Saya kira saya dapat membuat skrip bash lain untuk mengedit cron sebelum tanggal 1 dan lagi setelah mengatur hal-hal kembali, tetapi ini tampaknya ... najis.

SnakeDoc
sumber
tidak semua bulan memiliki 31 hari, bukankah itu menyebabkan masalah?
SnakeDoc
Tidak
Stéphane Chazelas
alternatif yang baik untuk solusi yang ditawarkan oleh @suspectus
SnakeDoc
2
atau 2-31 untuk bidang hari-bulan.
ash
@ash - lihat jawaban saya, itulah yang saya sarankan.
slm

Jawaban:

10

Dalam nada yang mirip dengan solusi yang diusulkan oleh @StephaneChazelas di komentar Anda dapat menentukan rentang hari di bidang ke-3 sebagai rentang untuk cron yang ingin Anda jalankan setiap hari selain tanggal 1 bulan itu.

Dua entri berikut akan mencapai apa yang Anda cari:

   0 22 1 * *      /path/to/script/1st_of_the_month.bash    
   0 22 2-31 * *   /path/to/script/every_day_except_1st.bash
slm
sumber
sebenarnya, sepertinya tidak bekerja untuk saya (kecuali jika saya melakukan sesuatu yang salah) - memformat dalam komentar sangat buruk - jadi lihatlah pastbin saya untuk apa yang saya dapatkan: pastebin.com/RKvy5d4e
SnakeDoc
oops, itu harus 0 22 2-31 * * dalam contoh Anda. saya akan mengedit.
SnakeDoc
1
@SnakeDoc - terima kasih, semua kolom mulai berbaur setelah beberapa saat 8-)
slm
ya saya juga melupakan mereka - saya mengaturnya, lalu melupakan bagaimana saya melakukannya (hal yang baik untuk halaman manual lol)
SnakeDoc
8

Cara termudah untuk mengatasinya adalah hanya memiliki satu entri cron. Ubah skrip bash untuk memeriksa tanggal - jika tanggal 1 bulan lalu panggil program java dengan parameter bulanan, atau panggil program dengan params harian.

Mengubah skrip membuat proses lebih sederhana karena skrip sebagai dokumen akan menjelaskan lebih baik apa yang terjadi tanpa memerlukan informasi tambahan dalam tabel cron.

Mod skrip dapat terlihat seperti ini-:

if [ $(date '+%d') == "1" ];then
   # monthly code
else
   # daily code
fi
tersangka
sumber
1
akhirnya pergi dengan solusi ini. Saya membuat skrip bash lain dengan kode sampel Anda, dan di bawah bulanan - skrip bash awal akan dimulai (yang pada gilirannya mengumpankan argumen bulanan ke program java yang mendasarinya), setiap hari memulai skrip harian, dll.
SnakeDoc
0
if [ $(date '+%d') == "1" ];then
  # monthly code
else
   # daily code
fi

Saya pikir menggunakan perbandingan integer jika lebih benar

date '+% d' menghasilkan 01 bukan 1 sehingga menggunakan == string comparaison akan salah

sebagai gantinya

if [ $(date '+%d') eq 1 ];then
    # monthly code
else
   # daily code
fi
Wodel
sumber