Saya memiliki tugas yang perlu dilakukan pada jadwal proyek saya (3 minggu).
Saya dapat mengatur cron untuk melakukan ini setiap minggu, atau (misalnya) pada minggu ke-3 setiap bulan - tetapi tidak dapat menemukan cara untuk melakukan ini setiap tiga minggu.
Saya bisa meretas skrip untuk membuat file sementara (atau yang serupa) sehingga bisa bekerja itu adalah ketiga kalinya dijalankan - tetapi solusi ini berbau.
Bisakah itu dilakukan dengan cara yang bersih?
Jawaban:
File crontab hanya memungkinkan Anda menentukan:
Jadi tidak mungkin menentukan minggu mana yang akan berlaku.
Menulis skrip pembungkus mungkin merupakan pilihan terbaik.
Anda bisa mendapatkan nomor minggu dalam skrip shell dengan menggunakan
atau
tergantung pada apakah Anda ingin minggu Anda dimulai pada hari Minggu atau Senin.
Jadi bisa digunakan
Dan $ cek akan menjadi 0 pada minggu ke-1, ke-4, ke-7, tahun ini.
sumber
Berkat jawaban sebelumnya, telah diarahkan ke opsi zaman untuk tanggal -e atau memformat sebagai% s
Meskipun agak menyakitkan
((date +%s) / 86400)
memberi hari dari zaman.Mengandalkan pekerjaan mingguan yang dijalankan pada saat yang sama, maka mudah untuk memeriksa ini terhadap hari tertentu dari periode 3 minggu (
$epoch_day%21 == 13
misalnya)Dalam kasus saya ini baik-baik saja, karena ini adalah tugas satu tembakan. Jika terlewatkan pada hari tertentu maka tidak perlu berlari pada kesempatan berikutnya.
sumber
Jika Anda dapat menyimpan file timestamp di antara proses, Anda dapat memeriksa tanggalnya alih-alih hanya mengandalkan tanggal saat ini.
Jika perintah find Anda mendukung nilai fraksional untuk
-mtime
(atau memiliki-mmin
) ( find GNU memiliki keduanya , POSIX tampaknya tidak membutuhkan keduanya ), Anda dapat 'membatasi' tugas cron dengan find dan touch .Atau, jika Anda memiliki perintah stat yang mendukung menampilkan tanggal file sebagai "detik sejak zaman" (mis. Stat dari Gnu coreutils , juga implementasi lainnya), Anda bisa membuat perbandingan sendiri menggunakan tanggal , stat , dan operator perbandingan shell (bersama dengan sentuhan untuk memperbarui file cap waktu). Anda juga mungkin dapat menggunakan ls alih-alih stat jika dapat melakukan format (mis. Ls dari GNU fileutils ).
Di bawah ini adalah program Perl (saya menyebutnya
n-hours-ago
) yang memperbarui file timestamp dan keluar dengan sukses jika cap waktu asli sudah cukup tua. Teks penggunaannya menunjukkan cara menggunakannya dalam entri crontab untuk mempercepat pekerjaan cron. Ini juga menjelaskan penyesuaian untuk "penghematan siang hari" dan bagaimana menangani cap waktu 'terlambat' dari proses sebelumnya.sumber