it-swarm-vi.tech

Tôi có thể chạy một công việc định kỳ thường xuyên hơn mỗi phút không?

Có thể chạy một công việc định kỳ cứ sau 30 giây mà không cần lệnh ngủ?

48
user15336

Nếu nhiệm vụ của bạn cần chạy thường xuyên, cron là công cụ sai. Bên cạnh thực tế là nó đơn giản sẽ không khởi động các công việc thường xuyên, bạn cũng có thể gặp một số vấn đề nghiêm trọng nếu công việc mất nhiều thời gian hơn so với khoảng thời gian giữa các lần khởi chạy. Viết lại nhiệm vụ của bạn để daemonize và chạy liên tục, sau đó khởi chạy nó từ cron nếu cần thiết (trong khi đảm bảo rằng nó sẽ không khởi động lại nếu nó đang chạy).

38
duskwuff -inactive-

Ứng cử viên cho sáng tạo nhất sử dụng sai của lệnh Linux:

Nohup watch -n 30 --precise yourprog >/dev/null &

Nếu yourprog bao gồm:

date +%M.%S.%N >> yourprog.out

sau đó yourprog.out có thể trông như:

50.51.857291267
51.21.840818353
51.51.840910204
52.21.840513307
52.51.842455224
53.21.841195858
53.51.841407587
54.21.840629676

cho thấy một mức độ chính xác khá tốt.

Dưới đây là một lời giải thích về các phần của lệnh:

  • Nohup - Điều này giữ cho lệnh tuân theo nó, watch trong trường hợp này, không thoát khi thiết bị đầu cuối thoát.
  • watch - Chương trình này chạy lệnh liên tục. Thông thường, màn hình đầu ra đầu tiên từ lệnh được hiển thị mỗi lần watch chạy lệnh.
  • -n 30 - Khoảng thời gian để chạy lệnh. Trong trường hợp này cứ sau ba mươi giây.
  • --precise - Không có tùy chọn này, watch chạy lệnh sau distance giây. Với nó, mỗi lần bắt đầu lệnh bắt đầu trên khoảng thời gian nếu có thể. Nếu tùy chọn này không được chỉ định trong ví dụ, thời gian sẽ có sau và hơn 30 giây mỗi lần do thời gian cần thiết để khởi chạy và thực thi lệnh (yourprog).
  • yourprog - Chương trình hoặc dòng lệnh cho watch để thực thi. Nếu dòng lệnh chứa các ký tự đặc biệt cho Shell (ví dụ: dấu cách hoặc dấu chấm phẩy), nó sẽ cần được trích dẫn.
  • >/dev/null - Chuyển hướng lớn hơn đầu ra của lệnh đang được chạy bởi watch thành một tệp, /dev/null. Tập tin đó loại bỏ bất kỳ dữ liệu được ghi vào nó. Điều này ngăn đầu ra không được ghi vào màn hình hoặc, vì Nohup đang được sử dụng, nó ngăn đầu ra được gửi đến một tệp có tên Nohup.out.
  • & - Lệnh watch được chạy trong nền và điều khiển được trả về thiết bị đầu cuối hoặc tiến trình cha.

Lưu ý rằng Nohup, chuyển hướng đầu ra và & Toán tử điều khiển nền không dành riêng cho watch.

Dưới đây là giải thích về ví dụ yourprog script:

  • date - Xuất ra ngày và/hoặc thời gian hiện tại. Nó cũng có thể thiết lập chúng.
  • +%M.%S.%N - Cái này chỉ định định dạng đầu ra cho date để sử dụng. %M là phút hiện tại, %S là giây hiện tại và %N là nano giây hiện tại.
  • >> yourprog.out - Điều này chuyển hướng đầu ra của lệnh date đến một tệp có tên yourprog.out. Lớn hơn gấp đôi so với nguyên nhân khiến đầu ra được gắn vào tệp trên mỗi lệnh gọi thay vì nội dung trước đó được ghi đè.

Chỉnh sửa :

Có thể một thứ khác có thể bị lạm dụng (hoặc có thể đó là sử dụng hợp pháp) là bộ định thời hệ thống.

Xem systemd/Timers dưới dạng thay thế cronCron vs bộ định thời systemd .

Tôi sẽ cố gắng đăng một ví dụ sớm.

Cron được thiết kế để thức dậy mỗi phút, vì vậy không thể làm điều đó mà không có một số hack, ví dụ như giấc ngủ như bạn đã đề cập.

14
Balázs Pozsár
* * * * * /path/to/program
* * * * * sleep 30; /path/to/program

Đừng quên viết một cái gì đó vào chương trình của bạn để nó thoát ra nếu một phiên bản trước đó đang chạy.

#!/bin/sh

if ln -s "pid=$$" /var/pid/myscript.pid; then
  trap "rm /var/pid/myscript.pid" 0 1 2 3 15
else
  echo "Already running, or stale lockfile." >&2
  exit 1
fi

Tất nhiên, điều này vẫn để lại một cơ hội rất nhỏ cho thất bại, vì vậy hãy tìm kiếm google để có giải pháp tốt hơn cho môi trường của bạn.

13
ghoti

Bạn có thể làm điều này với phần mềm của bên thứ ba.

Một tùy chọn hoạt động tốt với tôi là cron thường xuyên

Nó cho phép độ chính xác đến mili giây và nó cung cấp cho bạn tùy chọn trì hoãn thực hiện tiếp theo cho đến khi thoát hiện tại ..

8
thatjuan

Tôi có một vài mối quan tâm:

. Điều. Tùy thuộc vào kịch bản, có thể có một số can thiệp đáng kể ở đây. Do đó, mã hóa trong một tập lệnh như vậy nên chứa một số mã để đảm bảo rằng chỉ một phiên bản của tập lệnh đã cho đang chạy cùng một lúc.

(2) Kịch bản có thể có nhiều chi phí hoạt động và tiêu tốn nhiều tài nguyên hệ thống hơn bạn muốn. Điều này đúng nếu bạn đang cạnh tranh với rất nhiều hoạt động hệ thống khác.

Do đó, như một poster đã đặt nó, trong trường hợp này, tôi nghiêm túc xem xét việc đưa một trình nền chạy với các quy trình bổ sung để đảm bảo nó vẫn chạy nếu nó có tầm quan trọng quan trọng đối với hoạt động của bạn.

2
mdpc

giải pháp đơn giản và yêu thích của tôi cho nhiệm vụ này:

mục nhập:
[.__.] * * * * * flock -w0 /path/to/script /path/to/script

kịch bản:
[.__.] while true;do echo doing something; sleep 10s;done

lười thay thế: :)

* * * * * flock -w0 /path/to/log watch -n 10 echo doing >> /path/to/log

hoặc là

* * * * * flock -w0 /path/to/log watch -n 10 /path/to/script

ưu

  • sử dụng lệnh flock để tránh việc chạy tập lệnh theo nhiều trường hợp cùng một lúc. Nó có thể rất quan trọng trong hầu hết các trường hợp.
  • Các lệnh flockwatch có sẵn trên hầu hết các bản cài đặt Linux

khuyết điểm

  • việc dừng loại "Dịch vụ" này cần hai bước [.__.]
    • bình luận ra mục nhập
    • giết tập lệnh hoặc lệnh watch
1
asvany

Một giải pháp, nếu đó là cho kịch bản của riêng bạn hoặc nếu bạn có thể gói nó:

  1. Nhận và nhớ thời gian bắt đầu.
  2. Nếu một tệp khóa mà bạn sẽ chạm vào sau đó, sẽ xuất hiện và tập lệnh không chạy trong 60 giây, đợi một giây và kiểm tra lại. (ví dụ: trong khi/ngủ) *
  3. Nếu tệp khóa vẫn còn sau 60 giây, hãy thoát với cảnh báo khóa cũ.
  4. Chạm vào tập tin khóa.
  5. Mặc dù tập lệnh không chạy trong 60 giây, hãy lặp lại tác vụ thực tế của bạn với thời lượng ngủ mong muốn.
  6. Xóa tập tin khóa.
  7. Thêm như cron tối thiểu.
  8. Bob là chú của bạn.

Ít đau đầu hơn là xây dựng và giám sát một daemon.

* Nếu bạn đang sử dụng PHP, hãy nhớ Clearstatcache ().

0
Someone