Unix: tidur sampai waktu yang ditentukan

12

Apakah ada perintah (semi-) standar Unix yang akan tidur sampai waktu yang ditentukan pada baris perintahnya? Dengan kata lain, saya mencari sesuatu yang mirip dengan sleepyang akan membutuhkan waktu bangun daripada durasi.

Sebagai contoh: sleeptill 05:00:00

Saya dapat membuat kode sesuatu tetapi lebih suka tidak menemukan kembali roda jika sudah ada sesuatu di luar sana.

Pertanyaan bonus: alangkah baiknya jika bisa mengambil zona waktu (seperti dalam sleeptill 05:00:00 America/New_York).

sunting Karena sifat dari apa yang saya lakukan, saya mencari solusi "tidur sampai T" daripada "jalankan perintah di T".

sunting Untuk menghindari keragu-raguan, jika saya menjalankan perintah pada pukul 18:00 dan menyuruhnya bangun pada pukul 17:00, saya berharap itu akan tidur selama 23 jam (atau, dalam beberapa kasus sudut berkaitan dengan waktu penghematan siang hari, selama 22 atau 24 jam.)

NPE
sumber
Anda bisa menggunakan cron, saya kira.
Bobby
Terima kasih, tetapi untuk penggunaan yang dimaksudkan itu benar-benar harus sleepseperti.
NPE

Jawaban:

18

Jika Anda menggunakan Unix yang memiliki perintah tanggal yang layak dan menggunakan bash, Anda bisa menggunakan format% s untuk menghitung waktu.

sleep $(( $(date -j 1700 +%s) - $(date +%s) ))

(1700 adalah 17:00 dan -j mengatakan tanggal untuk tidak benar-benar mengatur tanggal)

w00t
sumber
(+1) untuk saran. Jika saya menjalankan perintah pada pukul 18:00 dan menyuruhnya untuk bangun pada pukul 17:00, saya berharap untuk tidur selama 23 jam (atau, dalam beberapa kasus sudut berkaitan dengan waktu penghematan siang hari, selama 22 atau 24 jam). Di sinilah sarannya sayangnya rusak. [Saya juga harus mengubah -juntuk -d. Untuk membuatnya berjalan pada sistem Linux saya]
NPE
7
@aix: Di Linux (dan sistem lain dengan tanggal GNU), Anda dapat menggunakan spesifikasi tanggal yang canggih seperti date -d 'tomorrow 17:00'.
Gilles 'SO- stop being evil'
3
@NPE, btw, seseorang dapat mengimbangi dengan menggunakan pengingat-pembagian: echo $(( ($(date -d "3:00" +%s) - $(date +%s) + (60*60*24)) % (60*60*24) ))(mungkin hanya ada beberapa masalah di sekitar DST-perubahan)
hvr
13

Bagaimana dengan ini (menggabungkan ide w00t dan Gille ke dalam fungsi)?

function sleep_until {
  seconds=$(( $(date -d "$*" +%s) - $(date +%s) )) # Use $* to eliminate need for quotes
  echo "Sleeping for $seconds seconds"
  sleep $seconds
}

Pemakaian:

sleep_until 8:24
Sleeping for 35 seconds

sleep_until '23:00'
Sleeping for 52489 seconds

sleep_until 'tomorrow 1:00'
Sleeping for 59682 seconds
Tyler Rick
sumber
9

Check out linux / unix atperintah . Menggunakan contoh 5AM:

at 05:00 some_command

Ini juga mendukung zona waktu:

Nama zona waktu GMT, UCT atau ZULU (tidak sensitif huruf besar kecil) dapat mengikuti untuk menentukan bahwa waktu dalam Waktu Universal Terkoordinasi. Zona waktu lainnya dapat ditentukan menggunakan variabel lingkungan TZ.

Jeremy L
sumber
(+1) untuk saran. Sayangnya, itu tidak cocok dengan alur kerja saya. Saya memiliki skrip yang menjalankan banyak hal secara berurutan, dan saya ingin memastikan bahwa langkah-langkah tertentu tidak dimulai hingga waktu-waktu tertentu. Ini tentu saja dapat dikonversi menjadi sesuatu yang menggunakan cronatau at, tetapi itu akan menjadi susah untuk dikelola. Inilah alasan saya mencari sesuatu yang sleepmirip. Untuk saat ini, saya sudah menulis sendiri.
NPE
Ah, jadi Anda ingin jadwal pemblokiran. Mengapa tidak memiliki file negara melacak setiap langkah proses?
Jeremy L
Bisa saja, tetapi kedengarannya agak lebih rumit daripada yang saya pikir perlu. Langkah-langkahnya adalah perintah yang berbeda, dan skrip shell adalah apa yang mengatur alur kerja. Saya bisa "tidur sampai jam 5 sore" dalam skrip.
NPE
Dalam hal ini, jawaban w00t mungkin tepat seperti yang Anda cari.
Jeremy L
Ya, itu pasti dalam semangat yang benar. Sayangnya, itu rusak dalam beberapa kasus penting (bagi saya) dan tidak melakukan zona waktu.
NPE