Chạy một cron cứ sau 30 giây


313

Ok vì vậy tôi có một cron mà tôi cần chạy cứ sau 30 giây.

Đây là những gì tôi có:

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

Nó chạy, nhưng điều này chạy cứ sau 30 phút hay 30 giây?

Ngoài ra, tôi đã đọ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ụ nào khác tốt hơn mà tôi có thể sử dụng hoặc cài đặt trên Ubuntu 11.04 sẽ là một lựa chọn tốt hơn không? Có cách nào để sửa cron trên không?


CommaToast và điều gì xảy ra nếu ứng dụng Javascript hoặc Java của bạn bị lỗi vì một số lý do và thoát? Làm thế nào nó sẽ khởi động lại? :-)
paxdiablo

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


Tôi vừa tìm thấy điều này trong khi xem hồ sơ người dùng và thấy bạn đã trực tuyến chưa đầy 1 giờ trước (chỉ để kiểm tra xem acc có còn được sử dụng không), có lý do cụ thể nào mà bạn không chấp nhận bất kỳ câu trả lời nào dưới đây không?
Fabian N.

Câu trả lời:


731

Bạn có */30trong trình xác định phút - có nghĩa là mỗi phút nhưng với bước 30 (nói cách khác, cứ sau nửa giờ). Vì cronkhông đi xuống độ phân giải dưới phút, bạn sẽ cần tìm cách khác.

Một khả năng, mặc dù đó là một chút bùn (a) , là có hai công việc, một công việc bù 30 giây:

# Need these to run on 30-sec boundaries, keep commands in sync.
* * * * *              /path/to/executable param1 param2
* * * * * ( sleep 30 ; /path/to/executable param1 param2 )

Bạn sẽ thấy tôi đã thêm nhận xét và định dạng để đảm bảo dễ dàng giữ cho chúng được đồng bộ hóa.

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

Đối với các crontùy chọn khác (không dựa trên cơ sở), hãy xem các câu trả lời khác tại đây, đặc biệt là các câu hỏi được đề cập fcronsystemd. Đây có lẽ là tốt hơn giả sử hệ thống của bạn có khả năng sử dụng chúng (chẳng hạn như cài đặt fcronhoặc có một bản phân phối systemdtrong đó).


Nếu bạn không muốn sử dụng giải pháp bùn, bạn có thể sử dụng giải pháp dựa trên vòng lặp với một sửa đổi nhỏ. Bạn vẫn sẽ phải quản lý để giữ cho quá trình của bạn chạy ở một số dạng, nhưng, khi đã được sắp xếp, tập lệnh sau sẽ hoạt động:

#!/bin/env bash

# Debug code to start on minute boundary and to
# gradually increase maximum payload duration to
# see what happens when the payload exceeds 30 seconds.

((maxtime = 20))
while [[ "$(date +%S)" != "00" ]]; do true; done

while true; do
    # Start a background timer BEFORE the payload runs.

    sleep 30 &

    # Execute the payload, some random duration up to the limit.
    # Extra blank line if excess payload.

    ((delay = RANDOM % maxtime + 1))
    ((maxtime += 1))
    echo "$(date) Sleeping for ${delay} seconds (max ${maxtime})."
    [[ ${delay} -gt 30 ]] && echo
    sleep ${delay}

    # Wait for timer to finish before next cycle.

    wait
done

Mẹo nhỏ là sử dụng một sleep 30nhưng để khởi động nó trong nền trước khi tải trọng của bạn chạy. Sau đó, sau khi tải xong, chỉ cần chờ nền sleepkết thúc.

Nếu tải trọng mất nvài giây (trong đó n <= 30), thì thời gian chờ sau khi tải trọng sẽ là 30 - ngiây. Nếu phải mất nhiều hơn 30 giây, sau đó chu kỳ tiếp theo sẽ bị trì hoãn cho đến khi tải xong, nhưng không còn.

Bạn sẽ thấy rằng tôi có mã gỡ lỗi trong đó để bắt đầu trên ranh giới một phút để làm cho đầu ra ban đầu dễ theo dõi hơn. Tôi cũng tăng dần thời gian tải tối đa để cuối cùng bạn sẽ thấy tải trọng vượt quá thời gian chu kỳ 30 giây (một dòng trống bổ sung là đầu ra để có hiệu quả rõ ràng).

Một lần chạy mẫu tiếp theo (trong đó chu kỳ thường bắt đầu 30 giây sau chu kỳ trước):

Tue May 26 20:56:00 AWST 2020 Sleeping for 9 seconds (max 21).
Tue May 26 20:56:30 AWST 2020 Sleeping for 19 seconds (max 22).
Tue May 26 20:57:00 AWST 2020 Sleeping for 9 seconds (max 23).
Tue May 26 20:57:30 AWST 2020 Sleeping for 7 seconds (max 24).
Tue May 26 20:58:00 AWST 2020 Sleeping for 2 seconds (max 25).
Tue May 26 20:58:30 AWST 2020 Sleeping for 8 seconds (max 26).
Tue May 26 20:59:00 AWST 2020 Sleeping for 20 seconds (max 27).
Tue May 26 20:59:30 AWST 2020 Sleeping for 25 seconds (max 28).
Tue May 26 21:00:00 AWST 2020 Sleeping for 5 seconds (max 29).
Tue May 26 21:00:30 AWST 2020 Sleeping for 6 seconds (max 30).
Tue May 26 21:01:00 AWST 2020 Sleeping for 27 seconds (max 31).
Tue May 26 21:01:30 AWST 2020 Sleeping for 25 seconds (max 32).
Tue May 26 21:02:00 AWST 2020 Sleeping for 15 seconds (max 33).
Tue May 26 21:02:30 AWST 2020 Sleeping for 10 seconds (max 34).
Tue May 26 21:03:00 AWST 2020 Sleeping for 5 seconds (max 35).
Tue May 26 21:03:30 AWST 2020 Sleeping for 35 seconds (max 36).

Tue May 26 21:04:05 AWST 2020 Sleeping for 2 seconds (max 37).
Tue May 26 21:04:35 AWST 2020 Sleeping for 20 seconds (max 38).
Tue May 26 21:05:05 AWST 2020 Sleeping for 22 seconds (max 39).
Tue May 26 21:05:35 AWST 2020 Sleeping for 18 seconds (max 40).
Tue May 26 21:06:05 AWST 2020 Sleeping for 33 seconds (max 41).

Tue May 26 21:06:38 AWST 2020 Sleeping for 31 seconds (max 42).

Tue May 26 21:07:09 AWST 2020 Sleeping for 6 seconds (max 43).

Nếu bạn muốn tránh các giải pháp bùn, điều này có lẽ tốt hơn. Bạn vẫn sẽ cần một croncông việc (hoặc tương đương) để phát hiện định kỳ nếu tập lệnh này đang chạy và nếu không, hãy khởi động nó. Nhưng chính kịch bản sau đó xử lý thời gian.


(a) Một số đồng nghiệp của tôi sẽ nói rằng bùn là đặc sản của tôi :-)


29
Đây là một cách giải quyết tuyệt vời, vì vậy tôi nghĩ rằng nó vượt qua sự vô dụng
Câu hỏi

14
@ rubo77, chỉ khi mất ít hơn một giây để chạy :-) Nếu mất 29 giây, nó sẽ xảy ra lúc 0:00:00, 0: 00.59, 0:01:00, 0:01:59, v.v. .
paxdiablo

1
Siêu lén lút, rất sáng tạo!
K Raphael

2
Dấu ngoặc tròn cho dòng thứ hai là gì?
Nigel Alderton

2
Đây là một giải pháp đáng yêu cho một vấn đề mà nếu không thì làm tê liệt tính hiệu quả đối với các tác vụ nhất định yêu cầu thực hiện trong phân số phút. Cảm ơn bạn.
Fiddy Bux

67

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'\''

Cú pháp này có tương đương với paxdiablo không? Hoặc có sự khác biệt tinh tế?
Nicolas Raoul

Sự khác biệt là: Tôi đã sử dụng đường dẫn gốc đến nhị phân. @paxdiablo đã sử dụng một loại cú pháp meta. (và gọi một lớp vỏ phụ)
wildplasser 26/03/18

1
Ý tôi là, sử dụng &&thay vì ( ; ).
Nicolas Raoul

2
Lấy làm tiếc. Không, có một sự khác biệt; các &&nhà khai thác ngắn mạch, vì vậy lệnh tiếp theo trong chuỗi không được thực hiện nếu trước đó đã thất bại.
wildplasser 27/03/18

Độ chi tiết này không phải là một vấn đề đối với độ phân giải dưới phút.
juan Isaza

37

Độ chi tiết của Cron tính bằng phút và không được thiết kế để thức dậy mỗi xgiây để chạy thứ gì đó. Chạy nhiệm vụ lặp lại của bạn trong 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

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

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

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

1
Không phải là while [ true ]nguyên nhân khiến bạn có nhiều phiên bản của cùng một kịch bản, vì cron sẽ bắt đầu một kịch bản mới mỗi phút?
Carcamano

2
Bạn có thể thực hiện sleep $remainingTimekhi thời gian còn lại là 30 trừ đi thời gian thực hiện công việc (và giới hạn ở mức 0 nếu mất> 30 giây). Vì vậy, bạn dành thời gian trước và sau khi làm việc thực tế, và tính toán sự khác biệt.
mahemoff

32

Nếu bạn đang chạy HĐH Linux gần đây với SystemD, bạn có thể sử dụng đơn vị Hẹn giờ SystemD để chạy tập lệnh của mình ở bất kỳ mức độ chi tiết nào bạn muốn (về mặt lý thuyết xuống đến nano giây) và - nếu bạn muốn - quy tắc khởi động linh hoạt hơn nhiều so với Cron từng cho phép . Không sleepcần bùn

Phải mất thêm một chút để thiết lập hơn một dòng trong tệp cron, nhưng nếu bạn cần bất cứ điều gì tốt hơn "Mỗi phút", nó cũng đáng nỗ lực.

Mô hình hẹn giờ SystemD về cơ bản là thế này: bộ định thời là đơn vị bắt đầu các đơn vị dịch vụ khi hết giờ .

Vì vậy, đối với mỗi tập lệnh / lệnh mà bạn muốn lên lịch, bạn phải có một đơn vị dịch vụ và sau đó là một đơn vị hẹn giờ bổ sung. Một đơn vị hẹn giờ có thể bao gồm nhiều lịch trình, vì vậy thông thường bạn sẽ không cần nhiều hơn một bộ hẹn giờ và một dịch vụ.

Dưới đây là một ví dụ đơn giản ghi nhật ký "Hello World" cứ sau 10 giây:

/etc/systemd/system/helloworld.service:

[Unit]
Description=Say Hello
[Service]
ExecStart=/usr/bin/logger -i Hello World

/etc/systemd/system/helloworld.timer:

[Unit]
Description=Say Hello every 10 seconds
[Timer]
OnBootSec=10
OnUnitActiveSec=10
AccuracySec=1ms
[Install]
WantedBy=timers.target

Sau khi thiết lập các đơn vị này (trong /etc/systemd/system, như được mô tả ở trên, cho cài đặt toàn hệ thống hoặc tại cài đặt ~/.config/systemd/userdành riêng cho người dùng), bạn cần bật bộ hẹn giờ (không phải dịch vụ mặc dù) bằng cách chạy systemctl enable --now helloworld.timer( --nowcờ cũng khởi động bộ hẹn giờ ngay lập tức, nếu không, nó sẽ chỉ bắt đầu sau lần khởi động tiếp theo hoặc đăng nhập của người dùng).

Các [Timer]trường phần được sử dụng ở đây như sau:

  • OnBootSec - bắt đầu dịch vụ này nhiều giây sau mỗi lần khởi động.
  • OnUnitActiveSec- bắt đầu dịch vụ này nhiều giây sau lần cuối cùng dịch vụ được bắt đầu. Đây là nguyên nhân khiến bộ đếm thời gian lặp lại chính nó và hoạt động như một công việc định kỳ.
  • AccuracySec- đặt độ chính xác của bộ hẹn giờ. Bộ hẹn giờ chỉ chính xác như trường này đặt và mặc định là 1 phút (giả lập cron). Lý do chính để không đòi hỏi độ chính xác tốt nhất là để cải thiện mức tiêu thụ năng lượng - nếu SystemD có thể lên lịch cho lần chạy tiếp theo trùng với các sự kiện khác, thì nó cần đánh thức CPU ít thường xuyên hơn. Các 1mstrong ví dụ trên là không lý tưởng - Tôi thường thiết lập chính xác để 1(1 giây) trong việc làm sub phút theo lịch trình của tôi, nhưng điều đó có nghĩa rằng nếu bạn nhìn vào các bản ghi hiển thị "Hello World" bài viết, bạn sẽ thấy rằng nó thường trễ 1 giây. Nếu bạn ổn với điều đó, tôi khuyên bạn nên đặt độ chính xác thành 1 giây trở lên.

Như bạn có thể nhận thấy, bộ đếm thời gian này không bắt chước Cron rất tốt - theo nghĩa là lệnh không bắt đầu vào đầu mỗi chu kỳ đồng hồ treo tường (tức là nó không bắt đầu vào giây thứ 10 trên đồng hồ, sau đó là ngày 20 và cứ thế). Thay vào đó chỉ xảy ra khi bộ đếm thời gian trôi qua. Nếu hệ thống khởi động lúc 12:05:37, thì lần tiếp theo lệnh sẽ chạy vào lúc 12:05:47, sau đó vào lúc 12:05:57, v.v. Nếu bạn quan tâm đến độ chính xác của đồng hồ treo tường, thì bạn có thể muốn thay thế OnBootSecOnUnitActiveSeccác lĩnh vực và thay vào đó thiết lập một OnCalendarquy tắc với lịch trình mà bạn muốn (mà như xa như tôi hiểu không thể nhanh hơn 1 giây, sử dụng định dạng lịch). Ví dụ trên cũng có thể được viết là:

OnCalendar=*-*-* *:*:00,10,20,30,40,50

Lưu ý cuối cùng: như bạn có thể đoán, helloworld.timerđơn vị bắt đầu helloworld.serviceđơn vị vì chúng có cùng tên (trừ hậu tố loại đơn vị). Đây là mặc định, nhưng bạn có thể ghi đè lên bằng cách đặt Unittrường cho [Timer]phần.

Thông tin chi tiết khác có thể được tìm thấy tại:


2
Tôi thường bắt gặp những câu trả lời tốt hơn như thế này dưới phần bình luận. IMHO, mặc dù cron đã là chủ yếu cho các công việc theo lịch trình, câu trả lời này phải là câu trả lời được chấp nhận vì nó không phải là "công việc hack" của giấc ngủ và có nguy cơ song song thực hiện các nhiệm vụ dài hạn khi xem xét khoảng thời gian / tần suất cần thiết
Qiqo

2
câu trả lời tuyệt vời, nên là câu trả lời được chọn
GuidedHacking

21

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

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

vì 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'\''"


11
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

2
Rubo - nếu công việc mất nhiều giây (thay vì milli hoặc micro giây) để hoàn thành, thì bạn sẽ không chạy nó cứ sau 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 xấp xỉ trên mỗi lần chạy, nếu lớn hơn 1 giây.
Andrew

2
Điều này cũng không hữu ích nếu bạn muốn nhận báo cáo lỗi cho mỗi lần chạy riêng.
tham gia

joelin - lệnh tôi đưa ra không ngăn được dữ liệu nhật ký hoặc đầu ra, tôi đã đơn giản hóa lệnh để giải quyết câu hỏi. Để ghi nhật ký, mỗi lệnh có thể / nên được chuyển hướng đầu ra nếu bạn cần ghi nhật ký, ví dụ: script / rails runner -e sản xuất '\' 'Song.insert_latest' \ '' có thể được viết dưới dạng script / rails runner -e sản xuất '\' 'Song.insert_latest' \ '' 2> & 1> / path_to_logfile và một lần nữa có thể được thực hiện cho mỗi lệnh trong một mục nhập cron duy nhất.
Andrew

13

Bạn có thể kiểm tra câu trả lời của tôi cho câu hỏi tương tự này

Về cơ bản, tôi đã đưa vào đó một tập lệnh bash có 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 sự 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ó.

một cái gì đó như thế này

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


10

Sử dụng đồng hồ:

$ watch --interval .30 script_to_run_every_30_sec.sh

tôi có thể sử dụng một cái gì đó như thế $ watch --interval .10 php some_file.phpnào? hoặc watchchỉ hoạt động với các tập tin .sh?
Yevhenii Shashkov

Bạn có thể chạy bất cứ thứ gì với đồng hồ. Tuy nhiên, khoảng thời gian là giữa kết thúc và bắt đầu của lệnh tiếp theo, vì vậy --interval .30sẽ không chạy hai lần một phút. Tức là watch -n 2 "sleep 1 && date +%s"nó sẽ tăng cứ sau 3 giây.
jmartori

xin lưu ý rằng nó watchđược thiết kế để sử dụng thiết bị đầu cuối, vì vậy - trong khi nó có thể hoạt động mà không cần thiết bị đầu cuối (chạy với nohupđăng xuất sau đó) hoặc với thiết bị đầu cuối giả (chẳng hạn screen) - nó không có khả năng cho hành vi giống như cron, chẳng hạn như phục hồi từ thất bại, khởi động lại sau khi khởi động, v.v.
Guss

9

Công việc định kỳ không thể được sử dụng để sắp xếp 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 cho một công việc định kỳ để chạy cứ sau 5 giây. Thay thế là viết một kịch bản shell sử dụng sleep 5lệnh trong đó.

Tạo một tập lệnh shell mỗi-5- giây.sh bằng cách sử dụng vòng lặp bash while như 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ờ, thực thi kịch bản shell này trong nền bằng cách sử dụng nohupnhư dưới đây. Đ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 bạn. Đ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 &

4
Thời gian sẽ trôi. Ví dụ: nếu backup.shmất 1,5 giây để chạy, nó sẽ thực thi cứ sau 6,5 giây. Có nhiều cách để tránh điều đó, ví dụsleep $((5 - $(date +%s) % 5))
Keith Thompson

Tôi chưa quen với 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 như vậy'. Sau một số tìm kiếm, bạn dường như đã bỏ lỡ 'sh' sau nohup. Như thế này: $ nohup sh ./every-5-seconds.sh &
VHanded

6

Sử dụng fcron ( http://fcron.free.fr/ ) - mang lại cho bạn mức độ chi tiết trong vài giây và cách tốt hơn và nhiều tính năng hơn cron (vixie-cron) và cũng ổn định. Tôi đã từng tạo ra những thứ 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 hoạt động được!


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

3
Trên thực tế, lời thú tội của một kỹ sư hệ thống cho phép các nhà phát triển PHP .... :)
Adi Chiru

6

trong thư mục /etc/cron.d/

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

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

sẽ chạy cron cứ sau 30 giây


4

Hiện tại tôi đang sử dụng phương pháp dưới đây. Hoạt động không có vấn đề.

* * * * * /bin/bash -c ' for i in {1..X}; do YOUR_COMMANDS ; sleep Y ; done '

Nếu bạn muốn chạy mỗi N giây sau đó X sẽ là 60 / NY sẽ là N .

Cảm ơn bạn.


Bạn có thể muốn thay đổi YOUR_COMMANDSthành YOUR_COMMANDS &, để lệnh được khởi chạy xuống nền, nếu không, nếu lệnh mất hơn một phần của giây - nó sẽ trì hoãn lần khởi chạy tiếp theo. Vì vậy, với X = 2 và Y = 30, nếu lệnh mất 10 giây - nó sẽ khởi chạy vào phút và sau đó 40 giây, thay vì 30. Kudus thành @paxdiablo.
Guss

Vì một số lý do, nếu tôi bỏ qua /bin/bash -cphần (bao gồm cả trích dẫn đối số) thì tập lệnh chỉ chạy mỗi phút, bỏ qua phép lặp (trong trường hợp của tôi X=12Y=5).
abiyi

3

Công việc Crontab có thể được sử dụng để sắp xếp công việc trong vài phút / giờ / ngày, nhưng không phải trong vài giây. Thay thế :

Tạo một kịch bản để thực hiện cứ sau 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 -evà một crontab để thực thi tập lệnh này:

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

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

2

Bạn có thể chạy tập lệnh đó dưới dạng dịch vụ, khởi động lại sau mỗi 30 giây

Đăng ký một dịch vụ

sudo vim /etc/systemd/system/YOUR_SERVICE_NAME.service

Dán vào lệnh bên dưới

Description=GIVE_YOUR_SERVICE_A_DESCRIPTION

Wants=network.target
After=syslog.target network-online.target

[Service]
Type=simple
ExecStart=YOUR_COMMAND_HERE
Restart=always
RestartSec=10
KillMode=process

[Install]
WantedBy=multi-user.target

Dịch vụ tải lại

sudo systemctl daemon-reload

Kích hoạt dịch vụ

sudo systemctl enable YOUR_SERVICE_NAME

Bắt đầu dịch vụ

sudo systemctl start YOUR_SERVICE_NAME

Kiểm tra trạng thái dịch vụ của bạn

systemctl status YOUR_SERVICE_NAME

1

Cảm ơn tất cả các câu trả lời tốt. Để làm cho nó đơn giản, tôi thích giải pháp hỗn hợp, với điều khiển 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 cứ sau 20 giây (ba lần mỗi phút). Dòng Crontab:

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

Kịch bản:

cd /home/a/b/checkAgenda

java -jar checkAgenda.jar
sleep 20
java -jar checkAgenda.jar 
sleep 20
java -jar checkAgenda.jar 

1-6 đại diện cho cái gì?
Phantom007

@ Phantom007 1-6 đại diện cho Thứ Hai đến Thứ Bảy, trong đó "-" là một phạm vi và "0" là Chủ Nhật. Đây là một liên kết tốt giải thích rất rõ tất cả các lĩnh vực và nơi bạn có thể kiểm tra nó: " crontab.guru/# * _ * _ * _ * _ 1-6"
jfajunior

1

ghi một tập lệnh shell tạo tập tin .sh

nano cứ sau 30 giây.

và viết kịch bản

#!/bin/bash
For  (( i=1; i <= 2; i++ ))
do
    write Command here
    sleep 30
done

sau đó đặt cron cho tập lệnh này crontab -e

(* * * * * /home/username/every30second.sh)

cron này gọi tệp .sh trong mỗi 1 phút và trong lệnh tệp .sh được chạy 2 lần trong 1 phút

nếu bạn muốn chạy tập lệnh trong 5 giây thì thay thế 30 bằng 5 và thay đổi vòng lặp như thế này: For (( i=1; i <= 12; i++ ))

khi bạn chọn bất kỳ giây nào, sau đó tính 60 / giây và ghi vào vòng lặp For


0

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

nohup watch -n30 "kill -3 NODE_PID" &

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

nohup ... & 

Đâ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ỏ (sự cố mạng, sự cố cửa sổ, v.v.)


0

Hãy nhìn vào cron thường xuyên - nó cũ nhưng rất ổn định và bạn có thể bước xuống micro-giây. Tại thời điểm này, điều duy nhất tôi muốn nói là tôi vẫn đang cố gắng tìm cách cài đặt nó bên ngoài init.d nhưng là một dịch vụ systemd gốc, nhưng chắc chắn cho đến Ubuntu 18 nó chỉ chạy vẫn sử dụng init.d (khoảng cách có thể thay đổi trên các phiên bản sau). Nó có thêm lợi thế (?) Để đảm bảo rằng nó sẽ không sinh ra một phiên bản khác của tập lệnh PHP trừ khi trước đó đã hoàn thành, điều này giúp giảm các vấn đề rò rỉ bộ nhớ tiềm ẩn.


-1

Chạy trong một vòng lặp shell, ví dụ:

#!/bin/sh    
counter=1
while true ; do
 echo $counter
 counter=$((counter+1))
 if [[ "$counter" -eq 60 ]]; then
  counter=0
 fi
 wget -q http://localhost/tool/heartbeat/ -O - > /dev/null 2>&1 &
 sleep 1
done

Thậm chí giả định rằng 60phải là một 30, bạn có thể muốn di chuyển mà wget bên trong các iftuyên bố, nếu không nó thực hiện mỗi giây. Trong mọi trường hợp, tôi không chắc làm thế nào điều này tốt hơn chỉ là một sleep 30. Nếu bạn đang theo dõi thời gian UNIX thực tế chứ không phải là bộ đếm của bạn, nó sẽ tạo ra sự khác biệt.
paxdiablo

lặp lại bộ đếm in ra, bạn có thể tìm ra thời gian bị trì hoãn bởi EXCUTE LINE nếu KHÔNG chạy wget trong nền.
Lo Vega
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.