Anda memiliki */30
di menit specifier - yang berarti setiap menit namun dengan langkah 30 (dengan kata lain, setiap setengah jam). Karena cron
tidak turun ke resolusi sub-menit, Anda perlu menemukan cara lain.
Satu kemungkinan, meskipun ini sedikit kludge (a) , adalah memiliki dua pekerjaan, satu diimbangi dengan 30 detik:
# Need these to run on 30-sec boundaries, keep commands in sync.
* * * * * /path/to/executable param1 param2
* * * * * ( sleep 30 ; /path/to/executable param1 param2 )
Anda akan melihat saya telah menambahkan komentar dan diformat untuk memastikan mudahnya menyinkronkannya.
Kedua cron
pekerjaan benar-benar berjalan setiap menit tetapi yang terakhir akan menunggu setengah menit sebelum mengeksekusi "daging" pekerjaan /path/to/executable
,.
Untuk cron
opsi (non- berbasis) lainnya, lihat jawaban lain di sini, terutama yang menyebutkan fcron
dan systemd
. Ini mungkin lebih baik dengan asumsi sistem Anda memiliki kemampuan untuk menggunakannya (seperti menginstal fcron
atau memiliki distro systemd
dengannya).
Jika Anda tidak ingin menggunakan solusi kludgy, Anda dapat menggunakan solusi berbasis loop dengan sedikit modifikasi. Anda masih harus mengelola agar proses Anda tetap berjalan dalam beberapa bentuk tetapi, setelah diurutkan, skrip berikut akan berfungsi:
#!/bin/env bash
# Debug code to start on minute boundary and to
# gradually increase maximum payload duration to
# see what happens when the payload exceeds 30 seconds.
((maxtime = 20))
while [[ "$(date +%S)" != "00" ]]; do true; done
while true; do
# Start a background timer BEFORE the payload runs.
sleep 30 &
# Execute the payload, some random duration up to the limit.
# Extra blank line if excess payload.
((delay = RANDOM % maxtime + 1))
((maxtime += 1))
echo "$(date) Sleeping for ${delay} seconds (max ${maxtime})."
[[ ${delay} -gt 30 ]] && echo
sleep ${delay}
# Wait for timer to finish before next cycle.
wait
done
Caranya adalah dengan menggunakan sleep 30
tetapi untuk memulainya di latar belakang sebelum payload Anda berjalan. Kemudian, setelah payload selesai, tunggu saja latar belakangnya sleep
selesai.
Jika payload mengambil n
detik (di mana n <= 30
), menunggu setelah payload kemudian akan menjadi 30 - n
detik. Jika dibutuhkan lebih dari 30 detik, maka siklus berikutnya akan tertunda hingga payload selesai, tetapi tidak lagi.
Anda akan melihat bahwa saya memiliki kode debug di sana untuk memulai pada batas satu menit untuk membuat output awalnya lebih mudah diikuti. Saya juga secara bertahap meningkatkan waktu payload maksimum sehingga pada akhirnya Anda akan melihat payload melebihi waktu siklus 30 detik (garis kosong tambahan adalah output sehingga efeknya jelas).
Contoh dijalankan berikut (di mana siklus biasanya dimulai 30 detik setelah siklus sebelumnya):
Tue May 26 20:56:00 AWST 2020 Sleeping for 9 seconds (max 21).
Tue May 26 20:56:30 AWST 2020 Sleeping for 19 seconds (max 22).
Tue May 26 20:57:00 AWST 2020 Sleeping for 9 seconds (max 23).
Tue May 26 20:57:30 AWST 2020 Sleeping for 7 seconds (max 24).
Tue May 26 20:58:00 AWST 2020 Sleeping for 2 seconds (max 25).
Tue May 26 20:58:30 AWST 2020 Sleeping for 8 seconds (max 26).
Tue May 26 20:59:00 AWST 2020 Sleeping for 20 seconds (max 27).
Tue May 26 20:59:30 AWST 2020 Sleeping for 25 seconds (max 28).
Tue May 26 21:00:00 AWST 2020 Sleeping for 5 seconds (max 29).
Tue May 26 21:00:30 AWST 2020 Sleeping for 6 seconds (max 30).
Tue May 26 21:01:00 AWST 2020 Sleeping for 27 seconds (max 31).
Tue May 26 21:01:30 AWST 2020 Sleeping for 25 seconds (max 32).
Tue May 26 21:02:00 AWST 2020 Sleeping for 15 seconds (max 33).
Tue May 26 21:02:30 AWST 2020 Sleeping for 10 seconds (max 34).
Tue May 26 21:03:00 AWST 2020 Sleeping for 5 seconds (max 35).
Tue May 26 21:03:30 AWST 2020 Sleeping for 35 seconds (max 36).
Tue May 26 21:04:05 AWST 2020 Sleeping for 2 seconds (max 37).
Tue May 26 21:04:35 AWST 2020 Sleeping for 20 seconds (max 38).
Tue May 26 21:05:05 AWST 2020 Sleeping for 22 seconds (max 39).
Tue May 26 21:05:35 AWST 2020 Sleeping for 18 seconds (max 40).
Tue May 26 21:06:05 AWST 2020 Sleeping for 33 seconds (max 41).
Tue May 26 21:06:38 AWST 2020 Sleeping for 31 seconds (max 42).
Tue May 26 21:07:09 AWST 2020 Sleeping for 6 seconds (max 43).
Jika Anda ingin menghindari solusi kludgy, ini mungkin lebih baik. Anda masih membutuhkan cron
pekerjaan (atau yang setara) untuk mendeteksi secara berkala jika skrip ini berjalan dan, jika tidak, mulai saja. Tapi skrip itu sendiri yang mengatur waktu.
(a) Beberapa teman kerja saya akan mengatakan bahwa kludges adalah keahlian saya :-)