Unix: sleep จนกระทั่งถึงเวลาที่กำหนด


12

มีคำสั่ง Unix มาตรฐาน (กึ่ง) ที่จะพักจนกว่าเวลาที่ระบุในบรรทัดคำสั่งของมัน? กล่าวอีกนัยหนึ่งฉันกำลังมองหาสิ่งที่คล้ายกับsleepที่จะใช้เวลาปลุกมากกว่าระยะเวลา

ตัวอย่างเช่น: sleeptill 05:00:00

ฉันสามารถเขียนโค้ดบางอย่างได้ แต่ไม่ควรคิดค้นวงล้อใหม่หากมีบางอย่างอยู่ที่นั่นแล้ว

คำถามโบนัส: จะดีมากถ้าใช้เขตเวลา (เหมือนในsleeptill 05:00:00 America/New_York)

แก้ไขเนื่องจากลักษณะของสิ่งที่ฉันทำฉันกำลังมองหาวิธีแก้ปัญหา "sleep จนกระทั่ง T" แทนที่จะเป็น "run command at T" solution

แก้ไขเพื่อหลีกเลี่ยงข้อสงสัยถ้าฉันเรียกใช้คำสั่งเวลา 18:00 นและบอกให้ตื่นตอน 17:00 น. ฉันคาดว่ามันจะนอนหลับได้นาน 23 ชั่วโมง (หรือในบางกรณีมีมุมที่ต้องทำตามเวลาออมแสง เป็นเวลา 22 หรือ 24 ชั่วโมง)


คุณสามารถใช้cronฉันเดา
Bobby

ขอบคุณ แต่สำหรับการใช้งานที่ตั้งใจมันจะต้องเป็นsleepเหมือน
NPE

คำตอบ:


18

หากคุณใช้ระบบปฏิบัติการ Unix ที่มีคำสั่ง date ที่เหมาะสมและใช้ bash คุณสามารถใช้รูปแบบ% s ในการคำนวณเวลาได้

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

(1700 เป็น 5PM และ -j วันที่บอกไม่ให้ตั้งวันที่จริง)


(+1) สำหรับคำแนะนำ ถ้าฉันรันคำสั่งเวลา 18:00 นและบอกให้ตื่นตอน 17:00 น. ฉันคาดว่ามันจะนอน 23 ชั่วโมง (หรือในบางมุมที่เกี่ยวข้องกับการประหยัดเวลากลางวันเป็นเวลา 22 หรือ 24 ชั่วโมง) ที่นี่เป็นข้อเสนอแนะที่น่าเสียดาย [ฉันต้องเปลี่ยนเป็น-jเพื่อ-dให้ทำงานบนระบบ Linux ของฉัน]
NPE

7
@aix: บนลินุกซ์ (และระบบอื่น ๆ ที่มีวัน GNU), คุณสามารถใช้รายละเอียดวันที่มีความซับซ้อนdate -d 'tomorrow 17:00'เช่น
Gilles 'หยุดชั่วร้าย'

3
@NPE, btw เราสามารถชดเชยได้โดยใช้การเตือนความจำ: echo $(( ($(date -d "3:00" +%s) - $(date +%s) + (60*60*24)) % (60*60*24) ))(อาจมีปัญหาบางอย่างเกี่ยวกับการเปลี่ยนแปลง DST)
hvr

13

แล้วเรื่องนี้ (รวมความคิดของ w00t และ Gille เข้ากับฟังก์ชั่น)

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

การใช้งาน:

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

9

ตรวจสอบลินุกซ์ / UNIX คำสั่งat ใช้ตัวอย่าง 5AM:

at 05:00 some_command

นอกจากนี้ยังรองรับเขตเวลา:

ชื่อเขตเวลาของ GMT, UCT หรือ ZULU (ตัวพิมพ์เล็กและใหญ่) สามารถติดตามเพื่อระบุว่าเวลาอยู่ในรูปแบบเวลาสากลเชิงพิกัด โซนเวลาอื่นสามารถระบุได้โดยใช้ตัวแปรสภาพแวดล้อม TZ


(+1) สำหรับคำแนะนำ น่าเสียดายที่มันไม่สอดคล้องกับกระบวนการทำงานของฉัน ฉันมีสคริปต์ที่ทำงานหลายอย่างตามลำดับและฉันต้องการให้แน่ใจว่าขั้นตอนบางอย่างจะไม่เริ่มต้นจนกว่าจะถึงเวลา แน่นอนว่าสิ่งนี้สามารถเปลี่ยนเป็นสิ่งที่ใช้cronหรือatแต่มันก็เป็นความเจ็บปวดในการจัดการ นี่คือเหตุผลที่ฉันกำลังมองหาบางสิ่งบางอย่างsleepเหมือน สำหรับตอนนี้ฉันได้เขียนของตัวเอง
NPE

อ่าคุณต้องการตารางเวลาการบล็อก ทำไมไม่มีไฟล์สถานะติดตามแต่ละขั้นตอนของกระบวนการ?
Jeremy L

ทำได้ แต่ฟังดูค่อนข้างซับซ้อนกว่าที่ฉันคิดไว้ ขั้นตอนคือคำสั่งที่แตกต่างกันและเชลล์สคริปต์เป็นสิ่งที่ควบคุมเวิร์กโฟลว์ ความสามารถในการ "นอนจนถึง 5 โมงเย็น" ในสคริปต์เป็นสิ่งที่ฉันต้องการจริงๆ
NPE

ในกรณีนั้นคำตอบของ w00t อาจเป็นสิ่งที่คุณต้องการอย่างแน่นอน
Jeremy L

ใช่มันเป็นจิตวิญญาณที่ถูกต้องแน่นอน น่าเศร้าที่มันแบ่งย่อยในบางกรณี (สำหรับฉัน) ที่สำคัญและไม่ได้ทำเขตเวลา
NPE
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.