ดำเนินการคำสั่งหลังจากวินาที (โดยไม่ต้องนอนหลับ)


15

ฉันจะรันคำสั่งหลังจาก X วินาทีโดยไม่ต้องหลับได้อย่างไร หรือกับ sleep แต่ไม่มีเชลล์แค่รอการตอบสนองของคำสั่งนั้น?

ฉันใช้สิ่งนี้ แต่มันใช้งานไม่ได้

sleep 5 ; ls > a.txt

ฉันต้องการเรียกใช้เป็นพื้นหลัง ฉันพยายามที่จะไม่เรียกใช้ในสคริปต์ฉันพยายามที่จะเรียกใช้lsหลังจาก 5 วินาทีและเปลือกไม่เพียงรอสิ้นการนอนหลับ


ทำไมมันไม่ทำงานโดยไม่มีเปลือก? คุณได้รับข้อผิดพลาดใด คุณกำลังผ่านเส้นทางที่เต็มไปด้วย? คุณรู้;หรือไม่ว่าส่วนใดที่แยกวิเคราะห์
Hennes

ด้วยวิธีนี้เชลล์จะบล็อก 5 วินาทีจากนั้นเรียกใช้คำสั่ง. เชลล์จะหยุดทำงานฉันไม่ต้องการมัน
Martin

จากนั้นคุณต้องเริ่มต้นด้วยสคริปต์ในพื้นหลังหรือในเชลล์ย่อย
Hennes

คำตอบ:


34

วิธีที่รัดกุมยิ่งขึ้นในการเขียนสิ่งที่ Hennes แนะนำคือ

(sleep 5; echo foo) & 

atหรือหากคุณต้องการมากกว่าไม่กี่วินาทีคุณสามารถใช้ การให้คำสั่งมีสามวิธีat:

  1. ท่อมัน:

    $ echo "ls > a.txt" | at now + 1 min
    warning: commands will be executed using /bin/sh
    job 3 at Thu Apr  4 20:16:00 2013
    
  2. บันทึกคำสั่งที่คุณต้องการเรียกใช้ในไฟล์ข้อความจากนั้นส่งไฟล์นั้นไปที่at:

    $ echo "ls > a.txt" > cmd.txt
    $ at now + 1 min < cmd.txt
    warning: commands will be executed using /bin/sh
    job 3 at Thu Apr  4 20:16:00 2013
    
  3. คุณยังสามารถส่งatคำสั่งจาก STDIN:

    $ at now + 1 min
    warning: commands will be executed using /bin/sh
    at> ls
    

    จากนั้นกดCtrlDเพื่อออกจากatเปลือก lsคำสั่งจะถูกเรียกใช้ในหนึ่งนาที

คุณสามารถให้เวลาที่แม่นยำมากในรูปแบบของ[[CC]YY]MMDDhhmm[.ss]เช่นเดียวกับใน

$ at -t 201412182134.12 < script.sh

สิ่งนี้จะเรียกใช้สคริปต์script.shเวลา 21:34 และ 12 วินาทีในวันที่ 18 ธันวาคม 2014 ตามทฤษฎีแล้วคุณสามารถใช้atเพื่อทำงานอะไรสักห้าวินาทีในอนาคต อย่างไรก็ตามมันก็เหมือนกับการใช้รถถังเพื่อบินได้อย่างรวดเร็วและคำแนะนำของ Hennes นั้นดีกว่า


ฉันทำกับ$(sleep 5; echo foo) &ฉันไม่แน่ใจว่าทำไมฉันถึงคิดว่าฉันต้องการเงิน $ ต่อหน้า แต่ด้วยไวยากรณ์ของฉันผิดฉันเพิ่งโพสต์เวอร์ชันที่ยาวขึ้น (และเข้าใจได้มากกว่า) (command_for_in_new_shell) สั้นกว่า
Hennes

@Hennes และฉันดึงความคิดที่ดีของคุณออกมาอย่างโจ๋งครึ่ม ทั้งหมดที่ฉันทำคือจัดรูปแบบให้สั้นลงเครดิตสำหรับความคิดที่แท้จริงเป็นของคุณ :)
terdon

มีวิธีใช้atกับการหน่วงเวลาเป็นวินาทีหรือไม่?
คดีของกองทุนโมนิก้า

@NicHartley หมายเลข ใช้เวลาเฉพาะ (เช่นat 21:43) ถ้านั่นคือสิ่งที่คุณต้องการหรือทำอะไรง่ายๆเช่นsleep 4 && commandวิ่งcommandหลังจาก 4 วินาที
terdon

4

คุณสามารถหลีกเลี่ยงได้โดยเริ่มต้นเชลล์หรือสคริปต์ในพื้นหลัง

ตัวอย่าง:

/ bin / sh -c "sleep 5; echo foo" &
[1] 63791
> เชลล์พร้อมใช้งานที่นี่

foo 5 วินาทีผลลัพธ์ที่ออกมาในภายหลังจะปรากฏขึ้น
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.