Anda hanya perlu menghitung sendiri untuk mendapatkan pekerjaan yang dibutuhkan untuk mencapai waktu Anda.
0 0-23/7 * * * whatever
30 3-23/7 * * * whatever
Algoritme sederhana dapat disimpulkan dari dua contoh ini (bila memiliki offset 30 menit):
- Tambahkan dua entri:satu dengan offset 0 menit dan satu lagi dengan offset 30 menit.
- Tentukan lebar rentang jam sama dengan
duration * 2
. - Tentukan selisih jam:yang pertama dimulai dengan 0, dan yang lainnya dimulai dengan durasi setelah membuang bagian 30 menit.
Jika Anda berpikir lebih jauh, Anda dapat menemukan solusi serupa untuk sesuatu seperti setiap 75 menit.
Edit:
Cron tidak dapat digunakan untuk semua jenis pekerjaan terjadwal. Misalnya, melaksanakan pekerjaan sebulan sekali pada hari terakhir bulan itu. Anda tidak bisa begitu saja melakukannya dengan cron karena hari terakhir setiap bulan berubah dari bulan ke bulan lainnya. Untuk mengatasinya, Anda dapat menjalankan tugas cron dalam kisaran nilai yang mungkin dari hari terakhir bulan (28-31) dan memverifikasi bahwa ini benar-benar hari terakhir atau tidak dalam skrip sebelum melakukan tugas yang sebenarnya.
Masukkan hasil dari perintah
date +%s
dalam variabel di crontab Anda. Sesuatu seperti WAKTU =1497950105. Sekarang di crontab Anda, Anda memerlukan entri seperti
* * * * * /bin/bash -c '[[ $(($(date +\%s)-TIME)) -gt seconds ]] && TIME=$(date +\%s) && whatever'
Di mana detik adalah jumlah detik yang Anda inginkan (12600 dalam kasus Anda).
Atau jika Anda ingin menunggu 3 jam 30 menit setelah program selesai
* * * * * /bin/bash -c '[[ $(($(date +\%s)-TIME)) -gt seconds ]] && whatever && TIME=$(date +\%s)'
Edit: Saya mengoreksi jawaban saya sebelumnya:
- Anda harus menghindari tanda % dengan \, jadi %s menjadi \%s
- Anda harus mendahului perintah dengan /bin/bash -c
Solusi lain (tanpa menggunakan WAKTU) adalah:
* * * * * /bin/bash -c '[[ $((($(date +\%s) / 60) % minutes)) -eq 0 ]] && whatever'
Di mana menit adalah 210 dalam kasus Anda.
Edit 2:
Seperti yang disarankan oleh MSalters, lebih baik menjalankan entri setiap N menit, dengan N adalah pembagi persekutuan terbesar antara 60 dan interval waktu Anda dalam menit
Dalam hal ini saya pikir Anda hanya mencoba menggunakan cron untuk melakukan sesuatu yang tidak mampu dilakukannya sendiri (tentu saja kecuali solusi di mana cron benar-benar mengeksekusi skrip pembantu secara berkala, dalam hal ini saya berpendapat itu bukan cron itu sendiri memecahkan masalah).
Solusi dengan interval 3 jam 30 menit tidak sepenuhnya benar. Ini adalah solusi yang diberikan:
0 0-23/7 * * * whatever
30 3-23/7 * * * whatever
Alasan ini salah adalah karena cron kemudian akan menjalankan pekerjaan pada waktu 21:00 dan 00:00, yang merupakan selang waktu 3 jam, bukan 3 jam 30 menit.
Solusi umum untuk semua interval waktu harus mampu menangani kasus yang tidak terbagi rata menjadi 24 jam. Meskipun tidak terbagi rata menjadi 24 jam, ia membagi secara merata menjadi seminggu! Cara termudah untuk memikirkan hal ini adalah dengan melakukan dua set "setiap 7 jam" yang tumpang tindih, seperti ini:
0 0-23/7 * * 1 whatever
0 4-23/7 * * 2 whatever
0 1-23/7 * * 3 whatever
0 5-23/7 * * 4 whatever
0 2-23/7 * * 5 whatever
0 6-23/7 * * 6 whatever
0 3-23/7 * * 7 whatever
30 3-23/7 * * 1 whatever
30 0-23/7 * * 2 whatever
30 4-23/7 * * 3 whatever
30 1-23/7 * * 4 whatever
30 5-23/7 * * 5 whatever
30 2-23/7 * * 6 whatever
30 6-23/7 * * 7 whatever
Sesuatu yang dapat dibagi dengan seminggu adalah yang terbaik yang dapat Anda lakukan, karena bulan tidak sejalan dengan minggu, dan itulah satu-satunya cara yang dapat dilakukan. Misalnya, selang waktu tepat setiap 12 menit adalah sepele dalam satu baris crontab, tetapi selang waktu tepat setiap 11 menit tidak mungkin dilakukan, karena 10080 tidak habis dibagi 11. (10080 adalah jumlah menit dalam seminggu).
Sangat mungkin untuk menulis algoritme untuk menyelesaikan kasus yang memungkinkan, tetapi ini jelas tidak terlalu berharga, terutama mengingat seperti apa solusi sebenarnya.