วิธีการเรียกใช้สคริปต์ทุก ๆ 5 วินาที?


66

ฉันมีสคริปต์ที่ต้องใช้งานทุกห้าวินาที ฉันรู้ว่าcronสามารถทำงานได้ทุกนาที แต่มีวิธีรันบางอย่างทุกวินาทีหรือไม่


3
คุณพยายามแก้ไขปัญหาอะไร คุณแน่ใจหรือว่า cron เป็นทางออกที่ถูกต้อง?
andol

1
ฉันรู้ว่า cron ไม่ใช่คำตอบที่ถูกต้อง ฉันกำลังบอกว่ามันไม่ได้อยู่ในคำถาม กรุณาอ่าน. ฉันพยายามที่จะทำให้สคริปต์ทำงานทุก 5 วินาที
myusuf3

2
ขออภัยเดาว่าฉันมีคำถามผิดเล็กน้อย ยังคงสงสัยว่าคุณกำลังพยายามแก้ปัญหาที่ถูกต้องหรือไม่
andol

สำหรับผู้ที่มาที่นี่กำลังมองหาวิธีการใช้งานทุก ๆ 5 วินาที ฉันขอแนะนำให้คุณดูที่การเรียนรู้วิธีการตั้งโปรแกรมเรียลไทม์ด้วยเครื่องมือเช่น socket.io เป็นตัวอย่าง
Brandon Bertelsen

คุณค้นพบคำสั่ง bash sleep หรือไม่? sleep 5หยุดชั่วคราว (อาจอยู่ในวงวน) เป็นเวลา 5 วินาที) ... ?
SDsolar

คำตอบ:


64

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

#!/bin/bash

while true; do
  # Do something
  sleep 5;
done

คุณสามารถสร้างไฟล์ที่มีเนื้อหาดังกล่าวข้างต้นและเรียกมันด้วยmy-task.sh sh my-task.shเป็นทางเลือกคุณสามารถกำหนดค่าด้วยsupervisorเป็นบริการเพื่อที่จะเริ่มเมื่อระบบบูท ฯลฯ

มันฟังดูเหมือนว่าคุณกำลังทำสิ่งที่คุณไม่ควรทำ นี้รู้สึกผิด


หนึ่งสามารถต้องการ aa cron ทำงานทุก 5 หรือน้อยกว่าวินาทีเพื่อใช้ใน PHP scrapers
Ravish Kumar

รู้สึกผิดจริงๆ หากคุณรวมไว้ในงาน cron แล้วคุณจะมีงานทับกันทุกนาที หลังจากหนึ่งชั่วโมง 60 งานจะเริ่มทุก ๆ 5 วินาที หากคุณไม่ได้รวมอยู่ในงาน cron คุณอาจไม่สามารถรู้วิธีหยุดมันหรือแม้กระทั่งรู้ว่ามันมีอยู่
SeF

35

คุณสามารถมีcronสคริปต์เริ่มงานทุกนาทีที่เริ่มต้นกระบวนการที่พื้นหลัง 12 กระบวนการดังนั้น:

* * * * * ~/dostuff.sh

dostuff.sh:

(sleep 5 && /path/to/task) &
(sleep 10 && /path/to/task) &
(sleep 15 && /path/to/task) &
(sleep 20 && /path/to/task) &
(sleep 25 && /path/to/task) &
(sleep 30 && /path/to/task) &
(sleep 35 && /path/to/task) &
(sleep 40 && /path/to/task) &
(sleep 45 && /path/to/task) &
(sleep 50 && /path/to/task) &
(sleep 55 && /path/to/task) &
(sleep 60 && /path/to/task) &

อย่างไรก็ตามคำถามของฉันคือEARTHคุณสามารถทำอะไรได้บ้างที่จะต้องวิ่งทุก 5 วินาที?


1
สิ่งนี้มีประโยชน์กับฉันเมื่อฉันสร้างสคริปต์ที่ตรวจสอบ/mediaไดเรกทอรีซ้ำ ๆสำหรับไดรฟ์ที่ฉันเสียบเข้ากับ usb สำหรับการสำรองข้อมูลอัตโนมัติ ...
VF1

32
What on EARTH- สถิติการรวบรวมขยะการซิงค์ไฟล์สถานะออนไลน์คุณตั้งชื่อ
ruX

3
การอ้างอิง API ภายนอกสำหรับข้อมูลใกล้เวลาจริง การเรียกใช้คำขอทุก ๆ 5 วินาทีนั้นดีกว่าทำทุกครั้งที่มีการดูหน้าเว็บ
Sergey Kudriavtsev

1
จะเกิดอะไรขึ้นถ้า crontab เรียกใช้งานไฟล์ dostuff.sh สองครั้ง ตัวอย่างเช่นในวินาทีที่สองสคริปต์จะถูกดำเนินการ แต่ยังไม่เสร็จ แต่ cron เรียกสคริปต์อีกครั้งจะเกิดอะไรขึ้น
TomSawyer

2
นี้ไม่ดี! มันอาจเรียกใช้สคริปต์มากกว่าหนึ่งครั้ง (ถ้าเกิดขึ้นจะใช้เวลานานกว่า 5 วินาที) ซึ่งอาจนำไปสู่สภาพการแข่งขันในการเข้าถึงไฟล์ใด ๆ (แม้ชั่วคราว) อย่าทำสิ่งนี้หากทำสิ่งเดียวกันสองครั้งในเวลาเดียวกันอาจทำให้เกิดปัญหา! (และโดยปกติจะเป็น!)
Nonny Moose

27

เพียงใช้ลูป:

while true ; do ./your-script & sleep 5; done

สิ่งนี้จะเริ่มต้นสคริปต์ของคุณเป็นงานพื้นหลังนอนเป็นเวลา 5 วินาทีแล้ววนซ้ำอีกครั้ง คุณสามารถใช้ Ctrl-C เพื่อยกเลิกหรือใช้เงื่อนไขอื่นแทนtrueเช่น! test -f /tmp/stop-my-scriptวนซ้ำในขณะที่/tmp/stop-my-scriptไม่มีไฟล์อยู่


ถ้าฉันรวมเครื่องหมายและมันก็บอกว่าbash: syntax error near unexpected token ';'ดังนั้นฉันเอามันออก ฉันทุบตี 4.3.11 คำสั่งของฉันทำงานได้อย่างรวดเร็วดังนั้นมันก็โอเคถ้ามันทำงานในเบื้องหน้า
Tyler Collier

1
@TylerCollier หากคุณไม่ต้องการ./your-scriptที่จะทำงานในพื้นหลัง (ในระหว่างการนอนหลับ 5 วินาที) คุณสามารถเก็บแต่ลดลง& ;ในฐานะที่เป็น&จุดประสงค์ของการแยกคำสั่งมันไม่จำเป็น (และเห็นได้ชัดว่าไม่ได้รับอนุญาต) ที่จะมี;หลังจากนั้นในบรรทัดเดียวกัน อีกวิธีคือการเขียนลูปในหลาย ๆ บรรทัด (โดยมีตัวแบ่งบรรทัดหลังจาก&และเลือกตัวแบ่งบรรทัดหลังจากdoและก่อนdoneเช่นกัน) เนื่องจาก;ภายหลัง&ดูเหมือนจะพิมพ์ผิดฉันได้ลบมัน blueyed: โปรดอย่าลังเลที่จะนำ;กลับมาถ้าคุณต้องการมัน; ถ้าเป็นเช่นนั้นฉันขอแนะนำให้เพิ่มคำอธิบายด้วย
Eliah Kagan

@EliahKagan FWIW ใช้งานได้กับ Zsh (ไม่มีข้อผิดพลาดทางไวยากรณ์) แต่ก็ไม่จำเป็นจริงๆ ขอบคุณสำหรับการแก้ไข!
blueyed

10

คุณสามารถใช้แพ็คเกจ GNU mcronซึ่งเป็นทางเลือก "Vixie cron"

http://www.gnu.org/software/mcron/manual/mcron.html#Top

"สามารถอนุญาตให้มีการระบุจุดเวลาที่ดีกว่าได้อย่างง่ายดายเช่นวินาทีโดยหลักการนี้สามารถขยายเป็นไมโครวินาทีได้ แต่นี่ไม่ได้นำมาใช้"


นั่นคือสิ่งที่ฉันกำลังมองหา ขอขอบคุณ!
SDsolar

โปรดโพสต์สิ่งนี้เป็นคำตอบสำหรับคำถามของฉันที่นี่: askubuntu.com/questions/922216/ …ดังนั้นฉันจึงสามารถยอมรับคำตอบของคุณได้
SDsolar



mcronจะต้องsendmailมีการติดตั้งและเปิดใช้งานโดยค่าเริ่มต้น วิธีการปิดการใช้งาน?
ihsan

2

การกำหนดค่าขั้นต่ำใน cron คือนาทีคุณไม่สามารถตั้งค่าได้ 5 วินาที คุณสามารถใช้ควอตซ์ซึ่งจะอนุญาตให้วินาที http://www.quartz-scheduler.org/docs/tutorials/crontrigger.html


ดูเหมือนว่าควอตซ์ไม่ใช่โอเพนซอร์ส ถูกต้องหรือไม่
txwikinger

มันมีรุ่นโอเพนซอร์ซ มันไม่มีหน้า แต่เพียงไปที่หน้าดาวน์โหลด คุณไม่ต้องกรอกแบบฟอร์มเพียงคลิกพาฉันไปที่การดาวน์โหลด
โคดี้ฮาร์โลว์

ดูเหมือนว่าจะเป็นโอเพ่นซอร์สอย่างน้อยในปี 2018 github.com/quartz-scheduler/quartz
dogmatic69

2

ใช้ cacti เพื่อตรวจสอบเราเตอร์และสวิตช์ แต่ Cron อนุญาตอย่างน้อยหนึ่งนาทีดังนั้นหากหนึ่งพอร์ต / อุปกรณ์หยุดทำงานจะไม่มีการเตือนจนกว่าจะผ่านไปสองนาที


1
ฉันขอแนะนำให้แก้ไขคำตอบนี้เพื่อขยายด้วยรายละเอียดเฉพาะเกี่ยวกับวิธีการทำเช่นนี้ (ดูเพิ่มเติมฉันจะเขียนคำตอบที่ดีได้อย่างไรสำหรับคำแนะนำทั่วไปเกี่ยวกับคำตอบประเภทใดที่ถือว่ามีค่ามากที่สุดใน Ask Ubuntu)
David Foerster

2

คุณสามารถใช้หน่วยตัวจับเวลา SystemD ซึ่งจะเรียกใช้บริการ - ซึ่งคุณได้ตั้งค่าให้ทำสิ่งที่คุณต้องการ - ทุก 5 วินาที

สมมติว่าหน่วยบริการของคุณถูกเรียกmystuff.serviceและติดตั้งใน/etc/systemd/system(ตรวจสอบผู้ใช้บริการ SystemDหากคุณต้องการแทนที่ crontab ของผู้ใช้) จากนั้นคุณสามารถเขียนหน่วยตัวจับเวลาเพื่อเรียกใช้บริการในเวลาบูตและจากนั้นทุก 5 วินาทีดังนี้

/etc/systemd/system/mystuff.timer

[Unit]
Description=my stuff's schedule
[Timer]
OnBootSec=5
OnUnitActiveSec=5
[Install]
WantedBy=timers.target

จากนั้นโหลดการกำหนดค่า systemd ใหม่เปิดใช้งานตัวจับเวลาและเริ่มต้น


1
มันเป็นทางออกที่ดีที่สุดข้อเสียเพียงอย่างเดียวคือ cron นั้นง่ายกว่าในการมองเห็นและกำหนดค่า SystemD เป็นความเจ็บปวดและเริ่มต้นด้วยโครงสร้างไดเรกทอรี ยังดีที่สุดสำหรับช่วงเวลา 5 วินาที
John

ข้อมูลโค้ดด้านบนจะไม่อยู่ใน /etc/systemd/system/mystuff.timer แทนที่จะเป็น mystuff.service หรือไม่
Brooks

@Brooks: ใช่ฉันไม่ดี - คัดลอกไม่ดี & วางอยู่ข้าง แก้ไขแล้ว.
Guss

ขอบคุณ ... ดีใจที่รู้ว่าฉันไม่ได้บ้าในขณะที่ฉันเรียนรู้ systemd :)
บรูกส์

1

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

#!/bin/sh

SLEEP=5

# do stuff
sleep $SLEEP

# do stuff
sleep $SLEEP

# do stuff
sleep $SLEEP

# do stuff
sleep $SLEEP

# echo and restart...
exec $0

'exec $ 0' รีสตาร์ทสคริปต์ แต่แทนที่สคริปต์ที่กำลังรัน สามารถเริ่มต้นด้วยบรรทัด crontab '@reboot'


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