it-swarm-vi.com

Làm thế nào để chạy các kịch bản cứ sau 5 giây?

Tôi có một kịch bản cần được chạy cứ sau năm giây. Tôi biết rằng cron có thể thực hiện các nhiệm vụ theo từng phút, nhưng có cách nào để chạy thứ gì đó mỗi giây không?

65
myusuf3

Cron chỉ cho phép tối thiểu một phút. Những gì bạn có thể làm là viết một tập lệnh Shell với một vòng lặp vô hạn chạy nhiệm vụ của bạn, và sau đó ngủ trong 5 giây. Bằng cách đó, nhiệm vụ của bạn sẽ được chạy nhiều hơn hoặc ít hơn cứ sau 5 giây, tùy thuộc vào thời gian thực hiện nhiệm vụ.

#!/bin/bash

while true; do
  # Do something
  sleep 5;
done

Bạn có thể tạo tệp my-task.sh với nội dung ở trên và chạy nó với sh my-task.sh. Tùy chọn, bạn có thể định cấu hình nó với supervisor như một dịch vụ để nó sẽ khởi động khi hệ thống khởi động, v.v.

Nó thực sự có vẻ như bạn đang làm một cái gì đó mà có lẽ bạn không nên làm. Cảm giác này sai .

64
Tommy Brunn

Bạn có thể có một công việc cron khởi động một tập lệnh mỗi phút bắt đầu 12 quy trình nền như sau:

* * * * * ~/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) &

Tuy nhiên, câu hỏi của tôi là Điều gì trên EARTH bạn có thể làm điều đó cần chạy cứ sau 5 giây không?

35
warren

Chỉ cần sử dụng một vòng lặp:

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

Điều này sẽ bắt đầu kịch bản của bạn như một công việc nền, ngủ trong 5 giây, sau đó lặp lại. Bạn có thể sử dụng Ctrl-C để hủy bỏ nó hoặc sử dụng bất kỳ điều kiện nào khác thay vì true, ví dụ: ! test -f /tmp/stop-my-script chỉ lặp trong khi tệp /tmp/stop-my-script không tồn tại.

27
blueyed

Bạn có thể sử dụng gói GNU mcron , một thay thế "Vixie cron".

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

"Có thể dễ dàng cho phép các điểm thời gian tốt hơn được chỉ định, tức là giây. Về nguyên tắc, điều này có thể được kéo dài đến micro giây, nhưng điều này không được thực hiện."

10
David

Sử dụng xương rồng để giám sát bộ định tuyến và chuyển đổi, nhưng Cron chỉ cho phép tối thiểu một phút, do đó, nếu một cổng/thiết bị ngừng hoạt động, không có cảnh báo nào cho đến khi hai phút trôi qua.

2
qttty

Cấu hình tối thiểu trong cron là phút, bạn không thể đặt nó trong 5 giây. Bạn có thể sử dụng Quartz cho phép vài giây. http://www.quartz-scheduler.org/docs/tutorials/crontrigger.html

2
Cody Harlow

Bạn có thể sử dụng đơn vị hẹn giờ SystemD, sẽ kích hoạt một dịch vụ - mà bạn đã thiết lập để làm những gì bạn muốn - cứ sau 5 giây.

Giả sử đơn vị dịch vụ của bạn được gọi là mystuff.service và được cài đặt trong /etc/systemd/system (kiểm tra dịch vụ người dùng SystemD nếu bạn muốn thay thế crontab của người dùng), sau đó bạn có thể viết đơn vị hẹn giờ để chạy dịch vụ khi khởi động và sau đó cứ sau 5 giây, như thế này:

/etc/systemd/system/mystuff.timer

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

Sau đó tải lại cấu hình systemd, kích hoạt bộ định thời và khởi động nó.

2
Guss

Tôi đã thực hiện loại điều này rất thành công (và kết quả cuối cùng kéo dài hàng tuần, cho đến khi máy được khởi động lại). Đối với những gì tôi đang làm ngay bây giờ, cập nhật thông tin và đưa nó vào bộ đệm - cập nhật cứ sau 10 giây.

#!/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' khởi động lại tập lệnh, nhưng thay thế tập lệnh đang chạy. Ban đầu, nó có thể được bắt đầu bằng dòng crontab '@reboot'.

1
Alister Bulman