Cron ทำงานทุก 15 วินาที


18

คุณช่วยแนะนำฉันว่าควรเขียนcrontabอะไรเพื่อทำงานบางอย่าง (สำหรับการทดสอบที่ฉันจะใช้/usr/bin/chromium-browser) ทุก ๆ 15 วินาที?


แทนที่จะเป็น crontab ให้ใช้ระบบการจัดการเหตุการณ์อื่น ๆ ตัวอย่างเช่นโมดูลทุก ๆ นาทีของ Perl จะช่วยให้คุณทำสิ่งนี้ได้
Nikhil Mulley

คำตอบ:


27

คุณไม่สามารถลงไปด้านล่างได้หนึ่งนาทีด้วย cron สิ่งที่คุณสามารถทำได้คือเรียกใช้สคริปต์ที่รันงานของคุณทุกนาทีรอ 15 วินาทีและทำซ้ำ บรรทัด crontab ต่อไปนี้จะเริ่มsome_jobทุก ๆ 15 วินาที

* * * * * for i in 0 1 2; do some_job & sleep 15; done; some_job

สคริปต์นี้อนุมานว่างานจะไม่ใช้เวลาเกิน 15 วินาที สคริปต์ที่ซับซ้อนมากขึ้นเล็กน้อยต่อไปนี้จะไม่เรียกใช้อินสแตนซ์ถัดไปหากใช้เวลานานเกินไป มันอาศัยdateการสนับสนุน%sรูปแบบ (เช่น GNU หรือ Busybox ดังนั้นคุณจะโอเคกับ Linux) หากคุณวางไว้ใน crontab โดยตรงโปรดทราบว่า%ตัวอักษรจะต้องเขียนเหมือน\%ในบรรทัด crontab

end=$(($(date +%s) + 45))
while true; do
  some_job &
  [ $(date +%s) -ge $end ] && break
  sleep 15
  wait
done
[ $(date +%s) -ge $(($end + 15)) ] || some_job

อย่างไรก็ตามฉันจะทราบว่าถ้าคุณต้องการทำงานบ่อยเท่าทุก ๆ 15 วินาที cron น่าจะเป็นวิธีที่ผิด แม้ว่ายูนิเซฟจะทำงานได้ดีในช่วงเวลาสั้น ๆ แต่ค่าใช้จ่ายในการเรียกใช้โปรแกรมทุก ๆ 15 วินาทีอาจไม่สามารถเพิกเฉยได้ (ขึ้นอยู่กับความต้องการของโปรแกรม) คุณไม่สามารถรันแอปพลิเคชันของคุณตลอดเวลาและให้มันทำงานทุก ๆ 15 วินาทีได้หรือไม่?


อาจเป็น: สำหรับฉันใน1 2 3 4 ; do some_job & sleep 15; done(การนอนหลับครั้งสุดท้ายจะไม่ส่งผลกระทบต่อการวิ่งครั้งต่อไป) แต่วิธีที่คุณทำได้ดีกว่าสำหรับระยะเวลาของจดหมาย cronjob ขาออก (ส่งหลังจาก some_job ที่ผ่านมาครั้งล่าสุด ตัวแปรของฉัน)
Olivier Dulac


13

วิธีการที่แตกต่างจากคนอื่น ๆ : เรียกใช้ 4 cronjobs แต่ละคนเดินโซเซ 15 วินาที:

* * * * * sleep 00; timeout 15s some_job
* * * * * sleep 15; timeout 15s some_job
* * * * * sleep 30; timeout 15s some_job
* * * * * sleep 45; timeout 15s some_job

เพื่อป้องกันไม่ให้งานเข้าไปยุ่งกับตัวเองเราจึง จำกัด เวลาทำงานเป็น 15 วินาทีผ่านทาง GNU coreutils ' timeoutสำหรับแต่ละงาน อย่างไรก็ตามโปรดทราบว่าหากงานล้มเหลวในการออกอย่างถูกต้องทันทีในตอนท้ายของยุค 15 คุณอาจยังคงมีปัญหา ดูคู่มือคำสั่งสำหรับรายละเอียดเกี่ยวกับวิธีการแก้ไขหากเป็นปัญหา นอกจากนี้โปรดทราบว่าหากคำสั่งใช้เวลานานกว่า 15 วินาทีและการหมดเวลาใช้งานจะทำให้คุณได้รับสถานะการออกที่ไม่เป็นศูนย์ซึ่งจะเรียกอีเมล cronjob


ยอดเยี่ยมแม้ว่าจะซ้ำซาก
Mike Kormendy

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

@ เวลาที่ดีจุด ฉันพูดถึงเรื่องนี้บ้างในการแก้ไข
Otheus

2

ในระยะสั้น cron ไม่ใช่เม็ดที่มีเวลา ระยะเวลาที่สั้นที่สุดที่คุณจะได้รับคือ 1 นาที

#       .---------------- minute (0 - 59)
#       |       .------------- hour (0 - 23)
#       |       |       .---------- day of month (1 - 31)
#       |       |       |       .------- month (1 - 12) OR jan,feb,mar,apr ...
#       |       |       |       |       .----- day of week (0 - 6) (Sunday=0 or 7)  OR sun,mon,tue,wed,thu,fri,sat
#       |       |       |       |       |
#       *       *       *       *       *       command to be executed
        *       *       *       *       /usr/bin/chromium-browser

อย่างไรก็ตามคุณสามารถเขียนสคริปต์ที่จะทำงานทุก ๆ 15 วินาที ...


ฉันมีสาย* * * * * /usr/bin/chromium-browserใน crontab ตามคู่มือควรรันทุกนาที แต่ไม่มีอะไรทำงาน
xralf

มันยากที่จะเขียนสคริปต์แบบนี้เหรอ? ฉันควรถามคำถามอื่นหรือเขียนที่นี่ได้ไหม
xralf

งาน Cron ไม่มีเทอร์มินัลดังนั้นฉันคาดว่าเบราว์เซอร์จะล้มเหลว มันอาจทำอย่างเงียบ ๆ
BillThor

บันทึก cron ของฉันอยู่ใน / var / log / cron สำหรับอนุพันธ์ของ redhat เช่น fedora, centos ฯลฯ นอกจากนี้ยังอาจช่วยให้คุณสามารถอธิบายสิ่งที่คุณกำลังพยายามทำเพื่อให้ผู้คนมีภาพรวมของสิ่งที่เกิดขึ้น
rfelsburg

1

ใน crontab ของคุณ:

* * * *  /usr/bin/chromium-browser_starter

จากนั้นใน/usr/bin/chromium-browser_starter:

#!/bin/sh

# chromium-browser_starter
#
# Schedules /usr/bin/chromium-browser to run every 15 seconds for a minute.
# Intended to be called every minute through crond(8).

for ((secs=0; secs<46; secs+=15)); do
    (sleep $secs; /usr/bin/chromium-browser "$@") &
done

wait

เมื่อฉันเขียนps aux | grep chromหลังจากผ่านไปครู่หนึ่งฉันไม่เห็น Chromium-browser ทำงาน
xralf

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