Saya perlu serangkaian perintah atau satu perintah yang tidur sampai kemunculan berikutnya dari waktu tertentu seperti "4:00" terjadi.
Bagaimana saya melakukannya?
The at
perintah atau cronjob bukan pilihan karena saya tidak harus meninggalkan naskah saya sedang dalam.
Kasus spesifik yang saya bicarakan adalah skrip yang berjalan di layar. Sangat penting bahwa saya tidak menghentikan eksekusi skrip oleh skrip itu sendiri karena ada menyimpan banyak variabel penting yang diperlukan di beberapa titik skrip. Script tidak selalu seharusnya dieksekusi dalam masalah biasa. Itu hanya perlu dieksekusi pada waktu tertentu.
Akan sangat bermanfaat jika skrip harus membuat file atau tugas lain seperti cronjobs atau layar lainnya. Ini hanyalah masalah desain.
Saya hanya punya ide yang luar biasa:
difference=$(($(date -d "4:00" +%s) - $(date +%s)))
if [ $difference -lt 0 ]
then
sleep $((86400 + difference))
else
sleep $difference
fi
Apakah Anda punya ide yang lebih baik?
Informasi lebih lanjut akan ditambahkan jika diminta!
date -d
dengandate -j
dan mengganti4:00
dengan0400
.Jawaban:
Saran terdon akan bekerja tetapi saya kira saran saya lebih efisien.
Ini menghitung perbedaan antara waktu yang diberikan dan waktu saat ini dalam detik. Jika angkanya negatif kita harus menambahkan detik untuk satu hari penuh (tepatnya 86400) untuk mendapatkan detik kita harus tidur dan jika angkanya positif kita bisa menggunakannya.
sumber
Dengan asumsi itu adalah skrip shell, ini seharusnya berfungsi:
Itu untuk 24 jam. Jika Anda ingin ini berlanjut pada pukul 4:00 AM dan 4:00 PM, gunakan ini sebagai gantinya:
sumber
Pada OpenBSD , berikut ini dapat digunakan untuk memadatkan pekerjaan
*/5
5 menitcrontab(5)
menjadi pekerjaan00
per jam (untuk memastikan lebih sedikit email yang dihasilkan, semuanya sambil melakukan tugas yang sama pada interval yang tepat):Perhatikan bahwa hal
date(1)
itu juga akan merusaksleep(1)
desain pada iterasi akhir, karena60
notulen bukan waktu yang valid (kecuali jika itu!), Sehingga kami tidak perlu menunggu waktu tambahan sebelum mendapatkan laporan email kami.Perhatikan juga bahwa jika salah satu iterasi memakan waktu lebih dari 5 menit yang dialokasikan untuk itu,
sleep
juga akan gagal dengan desain dengan tidak tidur sama sekali (karena apa yang merupakan angka negatif diartikan sebagai opsi baris perintah, alih-alih membungkus untuk jam berikutnya atau bahkan keabadian), sehingga memastikan pekerjaan Anda masih bisa selesai dalam waktu yang ditentukan (misalnya, jika hanya satu dari iterasi yang membutuhkan waktu lebih dari 5 menit, maka kami masih memiliki waktu untuk mengejar ketinggalan, tanpa apa pun yang membungkus ke jam berikutnya).Ini
printf(1)
diperlukan karenadate
mengharapkan tepat dua digit untuk spesifikasi menit.sumber