Bạn có thể tư vấn cho tôi những gì cần viết crontab
để nó chạy một số công việc (để kiểm tra tôi sẽ sử dụng /usr/bin/chromium-browser
) cứ sau 15 giây không?
Bạn có thể tư vấn cho tôi những gì cần viết crontab
để nó chạy một số công việc (để kiểm tra tôi sẽ sử dụng /usr/bin/chromium-browser
) cứ sau 15 giây không?
Câu trả lời:
Bạn không thể đi dưới mức độ chi tiết dưới một phút với cron. Những gì bạn có thể làm là, mỗi phút, chạy một kịch bản chạy công việc của bạn, đợi 15 giây và lặp lại. Dòng crontab sau đây sẽ bắt đầu some_job
cứ sau 15 giây.
* * * * * for i in 0 1 2; do some_job & sleep 15; done; some_job
Kịch bản này giả định rằng công việc sẽ không bao giờ mất quá 15 giây. Kịch bản phức tạp hơn một chút sau đây sẽ xử lý việc không chạy phiên bản tiếp theo nếu quá lâu để chạy. Nó phụ thuộc vào date
việc hỗ trợ %s
định dạng (ví dụ GNU hoặc Busybox, vì vậy bạn sẽ ổn trên Linux). Nếu bạn đặt nó trực tiếp trong một crontab, lưu ý rằng các %
ký tự phải được viết như \%
trong một dòng 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
Tuy nhiên tôi sẽ lưu ý rằng nếu bạn cần điều hành một công việc thường xuyên cứ sau 15 giây, thì cron có lẽ là cách tiếp cận sai. Mặc dù các thông báo là tốt với các quy trình có thời gian tồn tại ngắn, nhưng chi phí cho việc khởi chạy chương trình cứ sau 15 giây có thể không đáng kể (tùy thuộc vào mức độ yêu cầu của chương trình). Bạn không thể chạy ứng dụng của mình mọi lúc và để nó thực thi nhiệm vụ cứ sau 15 giây?
1 2 3 4 ; do some_job & sleep 15; done
(giấc ngủ cuối cùng sẽ không ảnh hưởng đến lần chạy tiếp theo), nhưng cách bạn làm điều đó có lẽ tốt hơn cho thời gian của thư cronjob gửi đi (được gửi ngay sau vài giây cuối cùng, trong vòng 15 giây sau biến thể của tôi)
Cách tiếp cận khác so với các cách khác: Chạy 4 cronjobs, mỗi lần so le trong 15 giây:
* * * * * sleep 00; timeout 15s some_job
* * * * * sleep 15; timeout 15s some_job
* * * * * sleep 30; timeout 15s some_job
* * * * * sleep 45; timeout 15s some_job
Để ngăn công việc can thiệp vào chính nó, chúng tôi giới hạn thời gian chạy của nó là 15 giây thông qua lõi GNU ' timeout
cho mỗi công việc. Tuy nhiên, lưu ý rằng nếu công việc không thoát đúng cách ngay lập tức vào cuối 15s, bạn vẫn có thể gặp vấn đề. Xem hướng dẫn sử dụng để biết chi tiết về cách giải quyết nếu nó trở thành vấn đề. Cũng lưu ý, nếu lệnh mất nhiều thời gian hơn 15 giây và thời gian chờ sẽ giết chết nó, bạn sẽ nhận được trạng thái thoát khác không sẽ kích hoạt email cronjob.
Nói tóm lại, cron không phải là dạng hạt với thời gian. Thời gian ngắn nhất bạn sẽ nhận được là 1 phút.
# .---------------- 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
Tuy nhiên, bạn có thể viết một kịch bản sẽ chạy cứ sau 15 giây ...
* * * * * /usr/bin/chromium-browser
trong crontab. Theo hướng dẫn, nó sẽ chạy mỗi phút nhưng không có gì là chạy.
Trong crontab của bạn:
* * * * /usr/bin/chromium-browser_starter
Sau đó trong /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
sau một phút, tôi không thể thấy trình duyệt crom đang chạy.
sleep
.