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


66

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 croncó thể thực hiện các nhiệm vụ theo từng phút, nhưng có cách nào để chạy một cái gì đó mỗi giây không?


3
Vấn đề gì bạn đang cố gắng giải quyết? Bạn có chắc chắn cron là giải pháp đúng?
andol

1
Tôi biết cron không phải là giải pháp đúng. Tôi đã nói nó không có trong câu hỏi. Xin vui lòng đọc. Tôi đang cố gắng để làm cho một kịch bản chạy cứ sau 5 giây.
myusuf3

2
Xin lỗi, tôi đoán câu hỏi hơi sai. Tuy nhiên, vẫn tự hỏi nếu bạn đang cố gắng giải quyết vấn đề đúng.
andol

Đối với những người đến đây tìm cách chạy một cái gì đó cứ sau 5 giây. Tôi thực sự khuyên bạn thay vì bạn nhìn vào việc học cách lập trình thời gian thực với các công cụ như socket.io làm ví dụ.
Brandon Bertelsen

Bạn đã phát hiện ra lệnh bash ngủ? sleep 5tạm dừng (có thể trong vòng lặp) trong 5 giây) ...?
SDsolar

Câu trả lời:


64

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 kịch bản 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 một my-task.shtệp có 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ó supervisornhư 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. Điều này cảm thấy sai .


Người ta có thể cần một cron chạy cứ sau 5 hoặc thậm chí ít hơn một giây để được sử dụng trong các trình dọn dẹp dựa trên PHP.
Ravish Kumar

Thực sự cảm thấy sai. Nếu bạn đưa nó vào một công việc định kỳ thì bạn sẽ có các công việc chồng chéo mỗi phút. Sau một giờ, 60 công việc sẽ bắt đầu cứ sau 5 giây. Nếu bạn không bao gồm trong một công việc định kỳ, tốt, bạn có thể không biết làm thế nào để ngăn chặn nó, hoặc thậm chí để biết nó tồn tại.
SeF

35

Bạn có thể có một croncông việc khởi động một kịch bản mỗi phút bắt đầu 12 quy trình nền:

* * * * * ~/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 mà cần chạy cứ sau 5 giây?


1
Chà, điều này rất hữu ích với tôi khi tôi tạo một tập lệnh liên tục kiểm tra /mediathư mục cho một ổ đĩa mà tôi cắm vào usb để sao lưu tự động ...
VF1

32
What on EARTH- thống kê, thu gom rác, đồng bộ hóa tập tin, trạng thái trực tuyến, bạn đặt tên cho nó.
ruX

3
Tham khảo API bên ngoài cho dữ liệu gần thời gian thực. Chạy yêu cầu cứ sau 5 giây thì tốt hơn nhiều so với thực hiện trên mỗi lần xem trang.
Serge Kudriavtsev

1
Điều gì sẽ xảy ra nếu crontab thực thi tệp do ware.sh hai lần? Ví dụ ở giây thứ 55, tập lệnh được thực thi nhưng chưa hoàn thành, nhưng cron gọi lại tập lệnh, điều gì sẽ xảy ra?
TomSawyer

2
THẬT TỆ! Nó có khả năng chạy tập lệnh nhiều lần một lần (nếu nó xảy ra mất hơn 5 giây) có thể dẫn đến tình trạng chạy đua trong bất kỳ tệp nào (thậm chí là tạm thời) được truy cập. ĐỪNG LÀM ĐIỀU NÀY nếu làm cùng một việc hai lần cùng một lúc có thể gây ra vấn đề! (Và điều đó thường sẽ!)
Nonny Moose

27

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ụ như ! test -f /tmp/stop-my-scriptchỉ lặp trong khi tệp /tmp/stop-my-scriptkhông tồn tại.


Nếu tôi bao gồm ký hiệu, nó nói bash: syntax error near unexpected token ';', vì vậy tôi lấy nó ra. Tôi có bash 4.3.11. Lệnh của tôi chạy rất nhanh nên không sao nếu nó chạy ở nền trước.
Tyler Collier

1
@TylerCollier Nếu bạn cần ./your-scriptchạy ở chế độ nền (trong thời gian ngủ 5 giây), bạn có thể giữ &nhưng thả ;. Vì &mục đích phân tách các lệnh, nên không cần thiết (và dường như không được phép) có ;sau lệnh trên cùng một dòng. Một cách khác là viết vòng lặp thành nhiều dòng (với một ngắt dòng sau &và, tùy ý, ngắt dòng sau dovà trước đó done). Vì ;sau này có &vẻ là một lỗi đánh máy, tôi đã xóa nó. blueyed: Xin vui lòng đặt ;lại nếu bạn thực sự muốn nó; nếu vậy, tôi đề nghị cũng thêm một lời giải thích.
Eliah Kagan

@EliahKagan FWIW, nó hoạt động trên Zsh (không có lỗi cú pháp), nhưng nó không thực sự cần thiết. Cảm ơn đã chỉnh sửa!
xanh lam

10

Bạn có thể sử dụng mcron gói GNU , 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."


Đó chính xác là những gì tôi đang tìm kiếm. Cảm ơn bạn!
SDsolar

Xin vui lòng gửi câu hỏi này như là một câu trả lời cho câu hỏi của tôi ở đây: askubfox.com/questions/922216/ trên để tôi có thể chấp nhận câu trả lời của bạn.
SDsolar



mcronyêu cầu sendmailphải được cài đặt và kích hoạt theo mặc định. Làm thế nào để vô hiệu hóa nó?
ihsan

2

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


Có vẻ như Quartz không phải là nguồn mở. Điều này có đúng không?
txwikinger

Nó có một phiên bản mã nguồn mở. Nó không có trang mà chỉ vào trang tải xuống. Bạn không cần phải điền vào mẫu chỉ cần nhấp đưa tôi đến phần tải xuống.
Cody Harlow

dường như là nguồn mở ít nhất là vào năm 2018. github.com/quartz-scheduler/quartz
dogmatic69

2

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.


1
Tôi khuyên bạn nên chỉnh sửa câu trả lời này để mở rộng nó với các chi tiết cụ thể về cách thực hiện việc này. (Xem thêm Làm thế nào để tôi viết một câu trả lời hay? Để có lời khuyên chung về loại câu trả lời nào được coi là có giá trị nhất trên Hỏi Ubuntu.)
David Foerster

2

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 mystuff.servicevà được cài đặt /etc/systemd/system(kiểm tra các 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 một đơn vị hẹn giờ để chạy dịch vụ trong thời gian khởi động và cứ sau 5 giây, như sau:

/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ó.


1
Đó là giải pháp tốt nhất, nhược điểm duy nhất là cron dễ tổng quan và cấu hình hơn rất nhiều. SystemD là một nỗi đau và nó bắt đầu với cấu trúc thư mục của nó. Vẫn là tốt nhất trong khoảng thời gian 5 giây
John

Đoạn mã trên có đi vào /etc/systemd/system/mystuff.timer thay vì mystuff.service không?
Brooks

@Brooks: vâng, xấu của tôi - sao chép xấu và dán về phía tôi. Đã sửa.
Guss

Cảm ơn ... rất vui khi biết tôi không điên khi đang học systemd :)
Brooks

1

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 với một dòng crontab '@reboot'.


8
Tại sao không sử dụng một whilevòng lặp thay vì liên tục khởi động lại tập lệnh?
David Z
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.