กำหนดเวลาคำสั่งให้เรียกใช้ในภายหลังได้อย่างสะดวกหรือไม่


87

วิธีง่ายๆในการใช้คำสั่งพูด 8 ชั่วโมงจากนี้คืออะไร? ฉันสามารถคิดแบบนี้:

nohup bash -c "sleep 28800 ; ./mycommand.sh" &

มีวิธีที่ "เหมาะสม" มากกว่านี้ไหม?


มีบางอย่างผิดปกติกับnohup+ sleepหรือไม่ ทำไม "ไม่เหมาะสม"?
cprn

คำตอบ:


123

คุณสามารถใช้atคำสั่ง atรันคำสั่งในเวลาต่อมา atยูทิลิตี้จะอ่านคำสั่งจากอินพุตมาตรฐานและกลุ่มพวกเขาร่วมกันเป็นที่งานที่จะดำเนินการในเวลาต่อมา

โดยปกติatจะติดตั้งตามค่าเริ่มต้นใน Ubuntu แต่ถ้ารุ่นของคุณไม่รวมให้ติดตั้งผ่าน:

sudo apt-get install at

สำหรับข้อมูลเพิ่มเติมตัวเลือกตัวอย่างและอื่น ๆ ดูที่Ubuntu Manpage Repository

ตัวอย่าง:

at now +8 hours -f ~/myscript.sh

นอกจากนี้คุณยังสามารถใช้ชวเลขอย่างสะดวกเช่นtomorrowหรือnoonเหมือนใน

echo "tweet fore" | at teatime 

คำเตือน:สิ่งนี้จะเรียกใช้คำสั่งทางด้านซ้ายของไพพ์ทันทีแต่จะแสดงเอาต์พุตในภายหลังเท่านั้น ตัวอย่างยังสาธิตวิธีที่คุณสามารถไพพ์แอ็คชันเข้าatมา at -cเป็นวิธีที่คุณสามารถตรวจสอบการกระทำที่กำหนดเวลาไว้ซึ่งคุณสามารถแสดงรายการตามหมายเลขได้อย่างสะดวกสบายเช่นเดียวกับ:

at -c 3

19
มันอาจจะมีประโยชน์ในการเพิ่มตัวอย่างการใช้งานแบบง่าย ๆ ที่ตอบคำถามของผู้โพสต์ดั้งเดิมโดยเฉพาะเช่นat now +8 hours -f ~/myscript.sh
steeldriver

6
นอกจากนี้ยังมีat 8:00การเรียกใช้คำสั่งในเวลาที่แน่นอนและbatchสำหรับ "เมื่อดูเหมือนว่าคอมพิวเตอร์ไม่ได้ใช้งาน"
Simon Richter

4
ในกรณีที่มีคนสงสัยteatimeอยู่ที่ 16:00 ด้วยเหตุผลบางอย่างมันไม่ได้กล่าวถึงในmanpages.ubuntu.com/manpages/raring/man1/at.1posix.htmlแต่มันอยู่ในman atและนี่manpages.ubuntu.com/manpages/raring/en/man1/at.1.html
ด่าน

3
บางทีเราสามารถพูดถึงว่า "ที่" ยูทิลิตี้ไม่ได้ติดตั้งโดยค่าเริ่มต้นและหากใครต้องการได้รับมันเพียงแค่ติดตั้งแพคเกจ "ที่"? แก้ไข: อย่างไรก็ตามฉันเพิ่งแก้ไขคำตอบ (เช่นแก้ไขลิงก์ manpage)
heartsmagic

4
ระวังว่าการไพพ์อินที่จะรันคำสั่งทันทีและกำหนดเวลาเอาต์พุตเท่านั้น ฉันมีการพิมพ์ 3 ชั่วโมง 4 ชั่วโมงล้มเหลวเพราะฉันต้องการกำหนดเวลาgpio write 8 1แต่ดำเนินการทันที
Maciej Swic

8

ใช่คุณสามารถตั้งค่างาน cron

ตัวอย่างเช่นถ้าตอนนี้เวลา 14:39:00 และวันนี้คือวันศุกร์, 30 สิงหาคม, คุณสามารถเพิ่มงาน cron ต่อไปนี้ (จะถูกเรียกใช้หลังจาก 8 ชั่วโมง) ในไฟล์ crontab ของคุณโดยใช้crontab -eคำสั่ง:

39 22 30 8 5  /path/to/mycommand.sh

เพิ่มเติมเกี่ยวกับ:


3
ตกลงใช่ฉันควรได้กล่าวถึงฉันรู้เกี่ยวกับงาน Cron นี่มันยิ่งยุ่งเหยิงเพราะถ้าอย่างนั้นมันอยู่ใน crontab ใช่ไหม?
Steve Bennett

4
@ RaduRădeanu: กับ cron ระวังว่ามันจะสามารถยิงได้อีกครั้งในอีกไม่กี่ปีข้างหน้า (เมื่อมีอีก 30 สิงหาคมที่เกิดขึ้นในวันศุกร์) ...
Olivier Dulac

2
นี่คือแฮ็คที่ฉลาด อย่างไรก็ตาม 'at' เป็นวิธีที่ดีกว่ามาก จะเกิดอะไรขึ้นหากคอมพิวเตอร์ปิดที่ 14:39
emory

1
เอ่อที่ยังไม่ใช่ประเด็นของฉัน ประเด็นของฉันคือข้อความที่คุณป้อนจะ (ฉันคิดว่า) อย่างแท้จริงยังคงนั่งอยู่ใน crontab ของคุณหลังจากเหตุการณ์สร้างงานการล้างข้อมูลใหม่สำหรับคุณ
Steve Bennett

2
@SteveBennett ใช่คุณถูกต้อง คำสั่งจะยังคงอยู่ในของคุณcrontabจนกว่าคุณจะลบออก อีกหนึ่งปีต่อมาเมื่อคุณลืมที่วางไว้ที่นั่นและทำไมคุณจะถูกเกาหัวสงสัยว่าจะทำอย่างไรกับคำสั่ง
Paddy Landau

8

ใช้ GUI คำพังเพยที่ใช้สำหรับcron, atและไม่ชอบ:

การแนะนำของCronHowtoแนะนำให้ใช้gnome-schedulegui ซึ่งดีกว่าการพิมพ์ขยะทั้งหมดลงในเทอร์มินัล (โดยเฉพาะสำหรับผู้ใช้ Ubuntu โดยเฉลี่ยที่ไม่ใช่ "กำลัง" * ผู้ใช้ nix / bsd)

เรียกใช้งานโดยใช้ Unity Dash (หรือเมนูแอปพลิเคชันอื่น ๆ ) เพื่อค้นหางานที่กำหนดเวลาหรือทำงานgnome-scheduleอยู่

บนระบบ Ubuntu ที่ใช้ Gnome เครื่องมือ Gnome Scheduled (จากแพ็คเกจ gnome-schedule) ใน Applications -> System Tools มีส่วนต่อประสานกราฟิกพร้อมให้ใช้ Cron เว็บไซต์โครงการอยู่ที่http://gnome-schedule.sourceforge.net/ ; ซอฟต์แวร์สามารถติดตั้งได้จากศูนย์ซอฟต์แวร์หรือโดยการพิมพ์

sudo apt-get install gnome-schedule

ในอาคารผู้โดยสาร

การใช้gnome-scheduleสคริปต์ในโฮมไดเรกทอรีของคุณคำสั่ง "at" ใหม่จะถูกตั้งค่าโดยใช้หน้าต่างประเภทนี้:

ป้อนคำอธิบายรูปภาพที่นี่


5

ฉันคิดหาวิธีที่รวดเร็วและสกปรกในการทำสิ่งนี้ก่อนที่ฉันจะค้นพบว่าatเป็นเรื่อง

สมมติว่าคุณต้องการให้สคริปต์ทำงานตอนเที่ยง:

until [[ "$(date)" =~ "12:00:" ]]; do
    sleep 10
done
./mycommand.sh

สมมติว่าคุณต้องการให้มันทำงานในวันพรุ่งนี้ตอนเที่ยง (วันนี้คือ 24 พฤศจิกายนสำหรับฉัน):

until [[ "$(date)" =~ "25 12:00:" ]]; do 
    sleep 30
done
./mycommand.sh

อัปเดต : วิธีที่ดีกว่าเล็กน้อย: ทดสอบเฉพาะตัวเลขที่คุณสนใจโดยใช้date +FORMAT:

until [[ $(date +%H:%M) == 21:06 ]]; do
    ...

10
กับคนสองคนที่ได้ upvoted คำตอบนี้โปรดใช้at, cronหรือโปรแกรมจัดตารางเวลาจริงอื่น ๆ การกำหนดตารางงานทำได้ยากไม่ใช่ล้อที่คุณควรบูรณาการ
dimo414

1
@ dimo414 วิธีการของฉันผิดปกติ?
wjandrea

8
อย่างน้อยก็มีงานยุ่งรอคอยซึ่งสิ้นเปลือง ที่แย่กว่านั้นคือไม่รับประกันว่าจะถูกต้อง เป็นไปได้อย่างสมบูรณ์แบบ (หากไม่น่าเป็นไปได้) สำหรับเงื่อนไขที่จะพลาด การใช้ตัวกำหนดตารางเวลาของคุณกับนิพจน์ทั่วไปนั้นมีข้อผิดพลาดสูงเช่นกัน มันอาจจะทำงานได้ดีพอatแต่มีข้อดีที่ไม่เกิน
dimo414

(นอกเหนือจาก: ฉันไม่ได้ลงคะแนนให้กับคำตอบของคุณฉันไม่คิดว่าคนอื่นควรใช้มัน)
dimo414

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