Làm cách nào tôi có thể lên lịch cho một công việc định kỳ chạy cứ sau 10 giây trong linux?


14

Tôi biết cách làm mỗi phút, nhưng cứ sau 10 giây thì sao?

Câu trả lời:


10

Bạn không thể lên lịch công việc cứ sau mười giây, nhưng tôi cho rằng bạn có thể sắp xếp công việc để chạy mỗi phút và ngủ theo vòng trong khoảng thời gian 10 giây. Điều này sẽ được xác định khi lệnh của bạn được hoàn thành trước khi khoảng thời gian mười giây hết hạn, hoặc bạn sẽ bị chồng chéo khi lệnh tiếp theo chạy. Điều này cảm thấy giống như một giải pháp bấp bênh, nhưng nếu bạn có thể đảm bảo thực thi rất ngắn lệnh chính của tập lệnh, nó sẽ hoạt động.

#!/bin/bash
i=0

while [ $i -lt 6 ]; do
  /run/your/command &
  sleep 10
  i=$(( i + 1 ))
done

Tôi làm một điều tương tự ... Tôi chỉ sử dụng * trong crontab, và sau đó tập lệnh của tôi sử dụng đàn và vòng lặp mãi mãi, không bao giờ thoát ra trừ khi nó không thể có được khóa.
Peter

22

Tôi đã có một nhiệm vụ tương tự tuần trước. Giải pháp của tôi là nhân các mục cron tiêu chuẩn với tần số mong muốn. Crontab của tôi trông như:

* * * * * /usr/local/bin/php /var/www/myscript.php
* * * * * sleep 10; /usr/local/bin/php /var/www/myscript.php
* * * * * sleep 20; /usr/local/bin/php /var/www/myscript.php
* * * * * sleep 30; /usr/local/bin/php /var/www/myscript.php
* * * * * sleep 40; /usr/local/bin/php /var/www/myscript.php
* * * * * sleep 50; /usr/local/bin/php /var/www/myscript.php

Nếu bạn muốn kiểm tra kết quả của myscript.php, ví dụ để gỡ lỗi, chỉ cần nối thêm

&> /tmp/myscipt.log

đến từng dòng trong crontab ở trên. Sau đó, thiết bị xuất chuẩn và thiết bị xuất chuẩn sẽ được chuyển hướng đến tệp nhật ký.


2
+1 để sử dụng cron sáng tạo
shodanshok

2
Đây là giải pháp tốt nhất IMHO. Nó rõ ràng những gì nó đang làm và không yêu cầu một giải pháp kịch bản hoặc bên thứ ba.
Jeremy


0

Cron chỉ cho phép tối thiểu một phút. Bạn có thể thử điều này -

* * * * * ( sleep 10 ; /usr/bin/wget http://api.us/application/)

0

Nếu bạn muốn đi phụ 10 giây, ví dụ 5 giây, tôi khuyên bạn nên tạo một vòng lặp worker với một đoạn script nhỏ như thế:

#!/bin/bash

INTERVAL=5
while true; do

  echo "do something"

  # wait for next interval
  WAIT_UNTIL=$(($(date +%s) + $INTERVAL))
  while [ $(date +%s) -lt $WAIT_UNTIL ]; do
    sleep 1
  done

done

Nếu bạn cần đi phụ thứ hai, hãy thêm micro giây vào lệnh ngày.


0
* * * * * script to run
* * * * * sleep 10; script to run
* * * * * sleep 20; script to run

Ở đây, kịch bản có thể được chạy với độ dài 10 giây ...


Giải pháp này đã được đăng 5 năm trước. Bạn chỉ nên upvote nó thay vì đăng lại.
Gerald Schneider
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.