วิธีการหยุดสคริปต์ในเวลาที่กำหนดจนกว่าจะเริ่ม cron อีกครั้ง?


12

ฉันมี Raspberry Pi ที่ใช้ OSMC อยู่ (Debian based)

ฉันได้ตั้งค่างาน cron เพื่อเริ่มสคริปต์ sync.sh เมื่อเวลาเที่ยงคืน

0 0 * * * /usr/local/bin sync.sh

ฉันต้องหยุดสคริปต์ตอนเจ็ดโมงเช้า ขณะนี้ฉันกำลังใช้:

0 7 * * * shutdown -r now

มีวิธีที่ดีกว่า? ฉันรู้สึกว่าการรีบูตเครื่องเกินความจำเป็น

ขอบคุณ

คำตอบ:


25

คุณสามารถเรียกใช้กับtimeoutคำสั่ง ,

timeout - run a command with a time limit

Synopsis
timeout [OPTION] NUMBER[SUFFIX] COMMAND [ARG]...
timeout [OPTION]
Description

Start COMMAND, and kill it if still running after NUMBER seconds. SUFFIX may be 's' for seconds (the default), 'm' for minutes, 'h' for hours or 'd' for days. 

PS หากกระบวนการซิงค์ของคุณใช้เวลามากเกินไปคุณอาจลองใช้วิธีอื่นในการซิงค์ข้อมูลซึ่งอาจบล็อกการจำลองแบบ


การเชื่อมต่ออินเทอร์เน็ตของฉันช้าดังนั้นจึงใช้เวลานานในการซิงค์ คุณจะแนะนำสัญญาณใด ๆ
แอนโทนี่

@Anony คุณซิงค์ได้อย่างไรตอนนี้
Rabin


โดยเฉพาะอย่างยิ่ง: gist.github.com/feralhosting/4e7e93a7fecd8f55cb4a
แอนโธนี

@Athony คุณสามารถลองใช้แอปพลิเคชั่นอื่น ๆ เช่น syncthing ( syncthing.net ) หรือ BTSync ( resilio.com ) ซึ่งทำงานในระดับบล็อกของไฟล์ที่จะซิงค์
Rabin

9

หากการซิงค์ของคุณสามารถดำเนินการต่อได้อย่างง่ายดายหลังจากไฮเบอร์เนต 17 ชั่วโมงให้ลอง

0 0 * * * killall -CONT -g sync.sh || /usr/local/bin/sync.sh
7 0 * * * killall -STOP -g sync.sh

หากการซิงค์ของคุณต้องการรีสตาร์ทตั้งแต่ต้นให้ลอง

0 0 * * * exec /usr/local/bin/sync.sh
7 0 * * * killall -TERM -g sync.sh

หากงานซิงค์หรืองานย่อยของคุณเพิกเฉยต่อสัญญาณ แต่ไม่ทิ้งเศษให้ทำเช่นนั้น

0 0 * * * exec /usr/local/bin/sync.sh
7 0 * * * killall -KILL -g sync.sh

killallpsmisc


ฉันใช้สคริปต์ที่พบด้านล่างด้วย mirror -c ดูเหมือนจะไม่ได้รับการเริ่มต้นใหม่ ข้อใดที่คุณจะแนะนำ: gist.github.com/feralhosting/4e7e93a7fecd8f55cb4a
Anthony

เมื่อเห็นว่าสคริปต์ LFTP ต้องการให้ SIGTERM ล้างไฟล์ล็อคและพิจารณาโอกาสที่เซิร์ฟเวอร์หมดเวลาใช้งาน 17 ชั่วโมงหรือแย่กว่า [64] การจัดลำดับใหม่ฉันจะไปหา0 0 * * * timeout 7h /usr/local/bin/sync.shหรือkillall -TERMตัวแปรที่เทียบเท่ากันส่วนใหญ่ของฉัน
Roman Czyborra

4

ฉันจะใช้ cron เพื่อ "หยุด" หรือ "ฆ่า" บริการหรือสคริปต์ในเวลาที่กำหนด
ขั้นแรกให้สร้างงาน cron ของคุณเพื่อเรียกใช้งานหรือสคริปต์ของคุณ (คุณสามารถเรียกใช้ cron อื่นที่จะฆ่างานที่มีชื่อ sudo pkill wget)

ประการที่สองคุณต้องการเห็นการรันงาน crontab ในรูปแบบที่มีประโยชน์และอ่านได้ในผลลัพธ์ของ:

   ps -o pid,sess,cmd afx | egrep "( |/)cron( -f)?$"

พวกเขาจะปรากฏในบรรทัดแรกสิ่งนี้:

1108  1108 cron
4288  1108 \_ CRON
4289  4289     \_ /bin/sh -c /path/to/my/crontab/script1.sh
4290  4289         \_ /bin/bash /path/to/my/crontab/script1.sh
4295  4289             \_ /usr/bin/wget LINK

คอลัมน์แรกคือ PID ที่สองคือ Session ID และที่สามคือคำสั่งที่เริ่มโดย cron คุณสามารถฆ่ากระบวนการทั้งหมดที่เกี่ยวข้องกับงาน cron เฉพาะโดยใช้ Session ID ดังนั้นในตัวอย่างข้างต้นคุณควรจะฆ่า Session ID 4289:

   pkill -s 4289

คุณต้องใส่ pkill ในสคริปต์และเรียกใช้สิ่งนี้เป็น cron


Session ID จะเปลี่ยนทุกครั้งที่งาน cron ทำงานหรือไม่ แล้วหลังจากปิดและเปิด
แอนโทนี่

ใช่มันจะเปลี่ยนไป แต่ถ้าคุณเขียนสคริปต์คุณจะได้รับ PID และวางลงในตัวแปร คุณอาจจะสามารถใช้ชื่อถ้ามันปรากฏขึ้น pkill sync.sh
ddlingo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.