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 một cái gì đó mỗi giây không?
sleep 5
tạm dừng (có thể trong vòng lặp) trong 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 một cái gì đó mỗi giây không?
sleep 5
tạm dừng (có thể trong vòng lặp) trong 5 giây) ...?
Câu trả lời:
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.sh
tệ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ó 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. Điều này cảm thấy sai .
Bạn có thể có một cron
cô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?
/media
thư mục cho một ổ đĩa mà tôi cắm vào usb để sao lưu tự động ...
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ó.
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-script
chỉ lặp trong khi tệp /tmp/stop-my-script
không tồn tạ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.
./your-script
chạ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 do
và 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.
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."
mcron
yêu cầu sendmail
phả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ó?
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
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.
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.service
và đượ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ó.
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'.
while
vòng lặp thay vì liên tục khởi động lại tập lệnh?