Tidur sampai kemunculan waktu spesifik berikutnya

11

Saya perlu serangkaian perintah atau satu perintah yang tidur sampai kemunculan berikutnya dari waktu tertentu seperti "4:00" terjadi.

Bagaimana saya melakukannya?

The atperintah 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!

BrainStone
sumber
Bisakah Anda menjelaskan sedikit pertanyaan Anda? Apa maksud Anda ketika Anda berkata: "Saya tidak boleh meninggalkan naskah yang saat ini saya
masuki
Bagaimana kalau Anda memiliki skrip Anda memeriksa keberadaan file "bangun" dan tidur selama beberapa waktu sebelum memeriksa lagi? Kemudian Anda dapat menggunakan cron untuk membuat file, meningkatkan keandalan cron, tetapi Anda juga dapat memiliki skrip yang berumur panjang. Biarkan skrip menghapus file "bangun" ketika berhenti tidur.
kurtm
Perhatikan bahwa pada Mac Anda harus mengganti date -ddengan date -jdan mengganti 4:00dengan 0400.
pjvandehaar

Jawaban:

17

Saran terdon akan bekerja tetapi saya kira saran saya lebih efisien.

difference=$(($(date -d "4:00" +%s) - $(date +%s)))

if [ $difference -lt 0 ]
then
    sleep $((86400 + difference))
else
    sleep $difference
fi

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.

BrainStone
sumber
Apa yang terjadi jika jam sistem bergerak maju / mundur (mis: ntp).
WhyNotHugo
10

Dengan asumsi itu adalah skrip shell, ini seharusnya berfungsi:

while [ $(date +%H:%M) != "04:00" ]; do sleep 1; done

Itu untuk 24 jam. Jika Anda ingin ini berlanjut pada pukul 4:00 AM dan 4:00 PM, gunakan ini sebagai gantinya:

while [ $(date +%I:%M) != "04:00" ]; do sleep 1; done
terdon
sumber
Ini mungkin opsi. Saya hanya punya ide. Saya akan kembali dalam beberapa menit.
BrainStone
0

Pada OpenBSD , berikut ini dapat digunakan untuk memadatkan pekerjaan */55 menit crontab(5)menjadi pekerjaan 00per jam (untuk memastikan lebih sedikit email yang dihasilkan, semuanya sambil melakukan tugas yang sama pada interval yang tepat):

#!/bin/sh -x
for k in $(jot 12 00 55)
  do
  echo $(date) doing stuff
  sleep $(expr $(date -j +%s $(printf %02d $(expr $k + 5))) - $(date -j +%s))
done

Perhatikan bahwa hal date(1)itu juga akan merusak sleep(1)desain pada iterasi akhir, karena 60notulen 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, sleepjuga 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 karena datemengharapkan tepat dua digit untuk spesifikasi menit.

cnst
sumber