2012-03-08 38 views
178

Ok vì vậy tôi có một cron mà tôi cần phải chạy mỗi 30 giây ... đây là những gì tôi có dưới đâyChạy một cron mỗi 30 giây

*/30 * * * * /bin/bash -l -c 'cd /srv/last_song/releases/20120308133159 && script/rails runner -e production '\''Song.insert_latest'\''' 

Nó chạy nhưng là này 30 phút hoặc 30 giây. ..và tôi đã được đọc rằng cron có thể không phải là công cụ tốt nhất để sử dụng nếu tôi chạy nó thường xuyên. Có một công cụ tốt hơn mà tôi có thể cài đặt trên Ubuntu 11.04 sẽ là một lựa chọn tốt hơn hoặc là có một cách để sửa chữa cron trên

+0

CommaToast, và những gì sẽ xảy ra nếu ứng dụng Javascript hoặc Java của bạn rơi trên đối với một số lý do và lối thoát hiểm? Làm thế nào nó sẽ khởi động lại? :-) – paxdiablo

+9

Thêm một ứng dụng NodeJS nhỏ, lol. Tại sao không phải là một ứng dụng C++? Trong khi chúng ta đang ở đó, chúng ta có thể đặt tên là 'cron' và chạy nó như một dịch vụ. – Andrew

+1

có thể trùng lặp của [Làm thế nào để chạy Cronjobs thường xuyên hơn một lần mỗi phút?] (Http://stackoverflow.com/questions/4672383/how-to-run-cronjobs-more-often-than-once-per-minute) – rubo77

Trả lời

463

Bạn có */30 vào biên specifier - đó có nghĩa là mỗi phút nhưng với một bước của 30 (nói cách khác, mỗi nửa giờ). Kể từ khi cron không đi xuống đến độ phân giải phút phụ, bạn sẽ cần phải tìm một cách khác.

Một khả năng, mặc dù đó là một chút của một kludge, là phải có hai công việc, một bù đắp bằng 30 giây:

* * * * * /path/to/executable param1 param2 
* * * * * (sleep 30 ; /path/to/executable param1 param2) 

Cả cron công việc thực sự chạy mỗi phút nhưng một trong những thứ hai sẽ chờ đợi một nửa một phút trước khi thực hiện "thịt" của công việc, /path/to/executable.

+52

nếu câu trả lời của paxdiablo đã giúp bạn, hãy đánh dấu nó làm câu trả lời mặc định. – sufinawaz

+5

Đây là một giải pháp tuyệt vời, rất nhiều vì vậy tôi nghĩ rằng nó vượt qua nó kludginess –

+0

sẽ không làm việc này quá? '* * * * * (/ path/đến/thi hành param1 param2; ngủ 30;/path/to/thi hành param1 param2)' – rubo77

46

Bạn không thể. Cron có độ chi tiết 60 giây.

* * * * * cd /srv/last_song/releases/20120308133159 && script/rails runner -e production '\''Song.insert_latest'\'' 
* * * * * sleep 30 && cd /srv/last_song/releases/20120308133159 && script/rails runner -e production '\''Song.insert_latest'\'' 
33

granularity Cron là trong vài phút và không thiết kế để thức dậy vào mỗi x giây để chạy một cái gì đó. Chạy nhiệm vụ lặp đi lặp lại của bạn trong vòng một vòng lặp và nó sẽ làm những gì bạn cần:

#!/bin/env bash 
while [ true ]; do 
sleep 30 
# do what you need to here 
done 
+43

Hãy nhớ rằng không phải là _quite_ giống nhau. Nếu công việc mất 25 giây (ví dụ), nó sẽ bắt đầu sau mỗi 55 giây thay vì mỗi 30 giây. Nó có thể không quan trọng nhưng bạn nên nhận thức được những hậu quả có thể xảy ra. – paxdiablo

+6

Bạn có thể chạy công việc ở chế độ nền, sau đó nó sẽ chạy trong gần 30 giây. –

+1

khi [đúng] làm ngủ 30 # làm những gì bạn cần để ở đây làm --------- thực hiện nên trong trường hợp nhỏ – temple

10

Bạn có thể kiểm tra câu trả lời của tôi để this similar question

Về cơ bản, tôi đã bao gồm có một kịch bản bash tên "runEvery.sh" mà bạn có thể chạy với cron cứ sau 1 phút và chuyển qua làm đối số lệnh thực mà bạn muốn chạy và tần suất tính bằng giây mà bạn muốn chạy nó.

cái gì đó như

*/1 * * * * ~/bin/runEvery.sh 5 myScript.sh

8

Cron công việc này không thể được dùng để sắp xếp một công việc trong khoảng thời gian vài giây. tức là Bạn không thể lên lịch một công việc cron để chạy cứ sau 5 giây. Cách khác là viết một kịch bản lệnh shell sử dụng lệnh sleep 5 trong đó.

Tạo tập lệnh shell cứ sau 5-7 giây bằng cách sử dụng bash while loop như được hiển thị bên dưới.

$ cat every-5-seconds.sh 
#!/bin/bash 
while true 
do 
/home/ramesh/backup.sh 
sleep 5 
done 

Bây giờ, hãy chạy tập lệnh shell này ở chế độ nền sử dụng nohup như được hiển thị bên dưới. Điều này sẽ tiếp tục thực thi tập lệnh ngay cả sau khi bạn đăng xuất khỏi phiên của mình. Điều này sẽ thực thi kịch bản shell backup.sh của bạn cứ sau 5 giây.

$ nohup ./every-5-seconds.sh & 
+3

Thời gian sẽ trôi. Ví dụ, nếu 'backup.sh' mất 1,5 giây để chạy, nó sẽ thực thi sau mỗi 6,5 giây. Có nhiều cách để tránh điều đó, ví dụ 'ngủ $ ((5 - $ (ngày +% s)% 5))' –

+0

Tôi mới đến nohup, trong khi thực hiện ví dụ của bạn, nohup đang trả về 'không có tệp hoặc thư mục nào' . Sau một số tìm kiếm, có vẻ như bạn đã bỏ lỡ 'sh' sau nohup. Như thế này: $ nohup sh ./every-5-seconds.sh & – VHanded

3

Sử dụng fcron (http://fcron.free.fr/) - mang đến cho bạn chi tiết trong vài giây và cách tốt hơn và tính năng phong phú hơn cron (vixie-cron) và ổn định quá. Tôi đã từng làm những điều ngu ngốc như có khoảng 60 tập lệnh php chạy trên một máy trong các cài đặt rất ngu ngốc và nó vẫn thực hiện công việc của nó!

+0

Lời thú nhận của một nhà phát triển PHP;) –

+0

Thực ra, lời thú nhận của một kỹ sư hệ thống cho phép các nhà phát triển PHP .... :) –

15

Không cần cho hai mục cron, bạn có thể đặt nó vào một với:

* * * * * /bin/bash -l -c "/path/to/executable; sleep 30 ; /path/to/executable" 

như vậy trong trường hợp của bạn:

* * * * * /bin/bash -l -c "cd /srv/last_song/releases/20120308133159 && script/rails runner -e production '\''Song.insert_latest'\'' ; sleep 30 ; cd /srv/last_song/releases/20120308133159 && script/rails runner -e production '\''Song.insert_latest'\''"

+5

Lưu ý: điều này chỉ chạy đúng nếu tập lệnh mất ít hơn một giây để chạy – rubo77

+1

Rubo - nếu công việc mất vài giây (thay vì milli hoặc micro giây) để hoàn thành, sau đó bạn sẽ không chạy nó mỗi ba mươi giây để có thể chạy hai lần mỗi phút. Vì vậy, có, bắt đầu với 30 sau đó trừ đi số giây gần đúng trên mỗi lần chạy, nếu lớn hơn 1 giây. – Andrew

4

việc Crontab có thể được dùng để sắp xếp một công việc trong phút/giờ/ngày, nhưng không tính bằng giây. Giải pháp thay thế:

Tạo một kịch bản để thực hiện mỗi 30 giây:

#!/bin/bash 
# 30sec.sh 

for COUNT in `seq 29` ; do 
    cp /application/tmp/* /home/test 
    sleep 30 
done 

Sử dụng crontab -e và một crontab để thực hiện kịch bản này:

* * * * * /home/test/30sec.sh > /dev/null 
+1

nếu tôi hiểu chính xác điều này, tập lệnh này chạy 30 lần và chờ 30 giây giữa mỗi lần lặp lại. Làm thế nào nó có ý nghĩa để chạy nó mỗi phút trong cron? – FuzzyAmi

4

Sử dụng đồng hồ:

$ watch --interval .30 script_to_run_every_30_sec.sh 
+0

tôi có thể sử dụng cái gì đó như '$ watch --interval .10 php some_file.php'? hoặc 'watch' chỉ hoạt động với các tệp .sh? – fonjeekay

0

Tôi chỉ có một nhiệm vụ tương tự để thực hiện và sử dụng phương pháp sau:

nohup watch -n30 "kill -3 NODE_PID" & 

Tôi cần phải có định kỳ giết -3 (để nhận dấu vết ngăn xếp của chương trình) sau mỗi 30 giây trong vài giờ.

nohup ... & 

này là ở đây để chắc chắn rằng tôi không bị mất việc thực hiện đồng hồ nếu tôi mất vỏ (vấn đề mạng, các cửa sổ sụp đổ vv ...)

0

trong dir /etc/cron.d/

mới tạo ra một tập tin excute_per_30s

* * * * * yourusername /bin/date >> /home/yourusername/temp/date.txt 
* * * * * yourusername sleep 10; /bin/date >> /home/yourusername/temp/date.txt 

sẽ chạy cron mỗi 30 giây

0

Cảm ơn tất cả các câu trả lời hay. Để làm cho nó đơn giản tôi thích các giải pháp hỗn hợp, với sự kiểm soát trên crontab và phân chia thời gian trên kịch bản. Vì vậy, đây là những gì tôi đã làm để chạy một kịch bản mỗi 20 giây (ba lần mỗi phút). Crontab dòng:

* * * * 1-6 ./a/b/checkAgendaScript >> /home/a/b/cronlogs/checkAgenda.log 

Script:

cd /home/a/b/checkAgenda 

java -jar checkAgenda.jar 
sleep 20 
java -jar checkAgenda.jar 
sleep 20 
java -jar checkAgenda.jar 
Các vấn đề liên quan