Saya ingin menjalankan pekerjaan dari cron pukul 8.30 pada hari Senin pertama setiap bulan. Halaman Wikipedia cron mengatakan
Sementara biasanya pekerjaan dijalankan ketika waktu / tanggal bidang spesifikasi semua sesuai dengan waktu dan tanggal saat, ada satu pengecualian: jika kedua "hari bulan" dan "hari minggu" dibatasi (tidak "*"), maka baik bidang "hari bulan" (3) atau bidang "hari dalam seminggu" (5) harus cocok dengan hari ini.
(penekanan saya)
Apakah itu berarti saya tidak dapat melakukan hari Senin pertama di bulan itu, saya hanya dapat melakukan hari pertama (atau apa pun) dalam sebulan? Saya tidak bisa memikirkan cara untuk memutarnya.
Jawaban:
Anda dapat memasukkan kondisinya ke perintah crontab aktual:
Sekarang, jika kondisi ini benar pada salah satu dari tujuh hari pertama dalam sebulan, Anda memiliki hari Senin pertamanya. Perhatikan bahwa dalam crontab, sintaks persen perlu diloloskan:
Ganti
echo
perintah dengan perintah aktual yang ingin Anda jalankan. Saya menemukan pendekatan yang sama juga.sumber
[ "$(date '+%a')" = "Mon" ] && echo "It's Monday"
seperti halnya[ $(date '+%a') = "Mon" ] && echo "It's Monday"
Tapi, di crontab tampaknya gagal pada tes ini. Saya tidak bisa mendapatkan umpan balik yang berguna dari cron baik: saya mencoba ini[ "$(date '+%a')" = "Tue" ] >> /home/deploy/cron.log 2>&1
untuk menangkap output kesalahan ke dalam log tetapi itu tidak berfungsi baik: /date
output sudah benar? Misalnya, biarkancron
perintah dijalankan yang menampilkan ini ke file:date '+%a' > ~/datetest 2>&1
- lalu periksa apakah itu menghasilkan string yang tepat untuk dibandingkan.+%a
dibutuhkan melarikan diri ketika berada di crontab, yaitu garis yang dibutuhkan untuk menjadi ini:[ "$(date '+\%a')" = "Mon" ] && echo "It's Monday"
. Jika Anda dapat memperbarui jawaban Anda dengan itu akan sangat membantu pembaca di masa depan :) Terima kasih lagi - maksSaya memiliki komputer dengan lokal pada bahasa Spanyol, jadi, pendekatan ini tidak berfungsi untuk saya karena mon berubah menjadi lun
Bahasa lain juga akan gagal, jadi, saya melakukan sedikit variasi pada jawaban yang diterima yang menghilangkan kendala bahasa:
sumber
Saya merasa lebih mudah ketika tidak perlu menangani angka hari.
Jalankan Senin Pertama bulan:
yaitu jika bulan 1 minggu yang lalu tidak sama dengan bulan saat ini maka kita berada di hari 1 1 (= Senin) bulan itu.
Begitu pula untuk Jumat Ketiga
yaitu jika bulan 3 minggu yang lalu berbeda dengan bulan saat ini maka kita berada di hari ke-6 (= Jumat) bulan itu
sumber
Saya telah menjadwalkan pekerjaan untuk dijalankan pada Senin ke-4 setiap bulan pada pukul 16:00 sebagai berikut:
sumber
Sejauh yang saya tahu TIDAK mungkin hanya menggunakan crontab, namun seseorang dapat menggunakan fungsi wrapper untuk memilih hari yang benar dari entri contab "tujuh hari pertama bulan"; lihat ini dari entri.
Script wrapper akan menjadi
dan Anda perlu menjalankannya (dengan asumsi itu disebut wrapper.sh dan tersedia secara global) menggunakan entri crontab
sumber
Anda dapat mencoba menjalankan cronjob selama tujuh hari pertama bulan ini dan menjalankannya hanya pada hari Senin.
Di atas harus bekerja untuk Anda.
sumber
Saya sarankan untuk digunakan
dari pada
untuk menghindari masalah lokal.
sumber
Saya membuat solusi umum untuk masalah seperti ini, ini berfungsi untuk pertama, kedua, ketiga ..... hari kerja terakhir di bulan itu.
Anda bisa menggunakannya seperti ini:
Script run-if-today memeriksa rentang hari kerja dan tanggal minggu yang diinginkan, jika keduanya cocok maka menghasilkan 0, jika tidak 1.
Periksa kodenya di sini. https://github.com/xr09/cron-last-sunday
sumber
Saya percaya ini memecahkan masalah dengan lebih elegan:
sumber
Pada Solaris 10 saya harus memformat kondisi sebagai berikut:
sumber
Karena saya menafsirkan pernyataan cron saya menggunakan php dan js, saya tidak bisa menggunakan bash. Akhirnya saya menemukan bahwa itu adalah sebenarnya mungkin hanya dengan cron:
Semoga ini bisa membantu orang lain. Apapun, saya berharap Anda semua hari yang indah. :-)
sumber
Ini akan bekerja untuk setiap Senin setiap bulan.
sumber