Apakah 31 harus menyiratkan akhir bulan dalam pekerjaan cron?


13

Untuk pekerjaan cron, kami tahu kami dapat mengatur waktu seperti di bawah ini.

# +------------ Minute (0 - 59)
# | +---------- Hour (0 - 23)
# | | +-------- Day of the Month (1 - 31)
# | | | +------ Month (1 - 12)
# | | | | +---- Day of the Week (0 - 7) (Sunday is 0 or 7)
# | | | | |
# * * * * * command

Yang ingin saya tahu adalah bahwa ketika kita menetapkan hari pada bulan 31, apakah ini berarti akhir setiap bulan meskipun bulan tidak memiliki hari 31. Berharap untuk mendapatkan jawaban.

Terima kasih sebelumnya

Jawaban:


22

Tidak, 31 berarti 31.

Namun, Anda dapat melakukan beberapa tipu daya. Tetapkan pekerjaan untuk dijalankan pada hari apa pun yang berpotensi menjadi hari terakhir bulan itu (mis. 28-31 di bidang hari-bulan), lalu ganti perintah Anda dengan ekspresi shell yang terdiri dari tes pada tanggal menjaga perintah:

0 0 28-31 * * [ "`date +%m`" != "`date --date=tomorrow +%m`" ] && command

Ekspresi di dalam kurung tes hanya menanyakan apakah angka bulan hari ini berbeda dengan angka bulan besok, yang tentu saja hanya akan berlaku pada hari terakhir bulan itu. Perhatikan bahwa bentuk ekspresi ini tergantung pada lokal dateAnda - Anda mungkin perlu mengubahnya jika Anda tidak memiliki versi GNU saat ini.

Saya harus mengatakan bahwa saya tidak menciptakan ini - saya menemukannya dengan Google cepat di sebuah mailing list posting oleh Matthew Jarvis. Saya akan membayangkan ini sangat trik standar Unix lama.


1
Ini tidak bisa terlalu lama trik diberikan pilihan GNU-spesifik untuk "date" =)
jj33

4
Di situs stackexchange, mengajukan pertanyaan yang dapat dijawab dengan pencarian Google, BUKAN hal yang buruk. Sebenarnya itu adalah hal yang baik, karena orang berikutnya yang akan mencari ini di Google akan menemukan jawabannya di stackexchange dan datang ke sini.
miernik

12

Tidak, saya pikir yang terbaik yang dapat Anda lakukan adalah berjalan pada tengah malam pada tanggal 1 bulan itu, atau mengatur jalur crontab individu untuk setiap bulan (atau setidaknya, garis untuk bulan dengan 28,29,30 dan 31 hari)

0 0 28,29 2               * /my/command
0 0 30    4,6,9,11        * /my/command
0 0 31    1,3,5,7,8,10,12 * /my/command

Terima kasih paul! Saya akan mengikuti yang kedua. Untuk metode kedua apakah saya perlu mengatur file yang sama untuk tiga kali benar? Terima kasih lagi :)

Ya, Anda harus mengulanginya.
Paul Dixon

7
Saya tidak punya pengalaman dengan cron, tetapi tidakkah "0 0 28,29 2" dieksekusi dua kali dalam satu tahun kabisat? Bukan berarti ini akan menjadi masalah selama dua tahun ke depan, tetapi masih ...
Wim ten Brink

Itu poin yang bagus, tidak ada jalan mudah untuk itu
Paul Dixon

4

Saya tidak berpikir Anda dapat melakukan ini dengan mudah di Internet crontab.

Salah satu opsi adalah mengatur cronuntuk menjalankan skrip setiap hari dan kemudian membuat skrip itu sendiri memeriksa apakah itu adalah hari terakhir bulan itu.


3

Saya kira cron memiliki karakter khusus 'L' yang dimaksudkan untuk tujuan ini:

*    *    L    *    *    your_script.sh 

akan mengeksekusi skrip Anda pada hari terakhir setiap bulan

Di samping itu,

*    *    0    *    *    your_script.sh

Anda bahkan dapat menentukan sesuatu seperti:

*    *    *    *    1,5L    your_scrript.sh

untuk menjalankan skrip pada hari Senin dan Jumat terakhir setiap bulan

atau

*    *    *    *    1    your_script.sh

untuk menjalankan skrip setiap hari Senin di tengah malam.


0

Ini akan melakukan pekerjaan:

if [ $( date +%-d --date="tomorrow" ) -eq 1 ]
then echo Last day of the current month
else echo Not yet!
     exit 0
fi

exit 1
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.