Làm cách nào để đặt cron chạy các lệnh nhất định sau mỗi một tiếng rưỡi?Làm thế nào tôi có thể đặt cron để chạy các lệnh nhất định sau mỗi một tiếng rưỡi?
Trả lời
Có lý do chính đáng khiến bạn không thể sử dụng 1 giờ hoặc 2 giờ không? Nó sẽ đơn giản hơn cho chắc chắn.
tôi đã không cố gắng cá nhân này, nhưng bạn có thể tìm thấy một số thông tin ở đây vào việc cron để chạy mỗi 90 phút: http://keithdevens.com/weblog/archive/2004/May/05/cron
Một excert từ liên kết ở trên:
0 0,3,6,9,12,15,18,21 * * * <commands>
30 1,4,7,10,13,16,19,22 * * * <commands>
Đó là không thể với một biểu thức duy nhất trong bình thường cron
.
Điều tốt nhất bạn có thể làm mà không sửa đổi mã là:
0 0,3,6,9,12,15,18,21 * * * [cmd]
30 1,4,7,10,13,16,19,22 * * * [cmd]
Những thể được nén, tùy thuộc vào phiên bản của cron bạn phải:
0 */3 * * * [cmd]
30 1-23/3 * * * [cmd]
Hai dòng trong crontab. Dọc theo các dòng:
0 0,3,6,9,12,15,18,21 * * * /usr/bin/foo
30 1,4,7,10,13,16,19,22 * * * /usr/bin/foo
Bạn có thể làm điều đó với hai mục nhập crontab.Mỗi chạy mỗi ba giờ và họ được bù đắp bởi 90 phút một cái gì đó như thế này:
0 0,3,6,9,12,15,18,21 * * *
30 1,4,7, 10,13,16,19,22 * * *
Bạn cũng có thể sử dụng fcron mà cũng chấp nhận thông số kỹ thuật thời gian phức tạp hơn như:
@ 01h30 my_cmd
#! /bin/sh
# Minute Cron
# Usage: cron-min start
# Copyright 2014 by Marc Perkel
# docs at http://wiki.junkemailfilter.com/index.php/How_to_run_a_Linux_script_every_few_seconds_under_cron"
# Free to use with attribution
# Run this script under Cron once a minute
basedir=/etc/cron-min
if [ $# -gt 0 ]
then
echo
echo "cron-min by Marc Perkel"
echo
echo "This program is used to run all programs in a directory in parallel every X minutes."
echo
echo "Usage: cron-min"
echo
echo "The scheduling is done by creating directories with the number of minutes as part of the"
echo "directory name. The minutes do not have to evenly divide into 60 or be less than 60."
echo
echo "Examples:"
echo " /etc/cron-min/1 # Executes everything in that directory every 1 minute"
echo " /etc/cron-min/5 # Executes everything in that directory every 5 minutes"
echo " /etc/cron-min/13 # Executes everything in that directory every 13 minutes"
echo " /etc/cron-min/90 # Executes everything in that directory every 90 minutes"
echo
exit
fi
for dir in $basedir/* ; do
minutes=${dir##*/}
if [ $((($(date +%s)/60) % $minutes)) -eq 0 ]
then
for program in $basedir/$minutes/* ; do
if [ -x $program ]
then
$program &> /dev/null &
fi
done
fi
done
thêm dòng sau vào crontab của tôi và đang làm việc
15 */1 * * * root /usr/bin/some_script.sh >> /tmp/something.log
Bạn có thể mở rộng thêm về lý do tại sao đây là giải pháp tốt hay không. –
*/10 * * * * root perl -e 'exit(time()%(90*60)>60)' && command
90 - đó là một tiếng rưỡi trong vài phút
"> 60" - tôi đưa vào cron khả năng trì hoãn sự khởi đầu của kịch bản trong một phút
Cũng với sự trợ giúp của hack này, bạn có thể đặt bất kỳ khoảng thời gian nào với độ phân giải phút
Ví dụ: bắt đầu tập lệnh sau mỗi 71 phút
* * * * * root perl -e 'exit(time()%(71*60)>60)' && command
Bạn có thể đạt được bất kỳ tần số nếu bạn đếm phút (giờ, ngày, hoặc vài tuần) kể từ Epoch, thêm một điều kiện để phía trên cùng của kịch bản của bạn, và thiết lập các kịch bản để chạy mỗi phút trên crontab của bạn : ngày
#!/bin/bash
minutesSinceEpoch=$(($(date +'%s/60')))
# every 90 minutes (one and a half hours)
if [[ $(($minutesSinceEpoch % 90)) -ne 0 ]]; then
exit 0
fi
date(1)
lợi nhuận hiện tại, chúng tôi định dạng nó như giây kể từ Epoch (%s
) và sau đó chúng tôi làm toán cơ bản:
# .---------------------- bash command substitution
# |.--------------------- bash arithmetic expansion
# || .------------------- bash command substitution
# || | .---------------- date command
# || | | .------------ FORMAT argument
# || | | | .----- formula to calculate minutes/hours/days/etc is included into the format string passed to date command
# || | | | |
# ** * * * *
$(($(date +'%s/60')))
# * * ---------------
# | | |
# | | ·----------- date should result in something like "1438390397/60"
# | ·-------------------- it gets evaluated as an expression. (the maths)
# ·---------------------- and we can store it
Một bạn có thể sử dụng phương pháp này với các công việc cron theo giờ, hàng ngày hoặc hàng tháng:
#!/bin/bash
# We can get the
minutes=$(($(date +'%s/60')))
hours=$(($(date +'%s/60/60')))
days=$(($(date +'%s/60/60/24')))
weeks=$(($(date +'%s/60/60/24/7')))
# or even
moons=$(($(date +'%s/60/60/24/656')))
# passed since Epoch and define a frequency
# let's say, every 7 hours
if [[ $(($hours % 7)) -ne 0 ]]; then
exit 0
fi
# and your actual script starts here
Hi stefanmaric, vì bạn có vẻ kiên quyết trong vấn đề này, vui lòng thêm câu trả lời cho chỉ một trong các câu hỏi và gắn cờ những người thực sự trùng lặp là bản sao của kết hợp câu hỏi/câu trả lời hay nhất. – bummi
Hi @bummi, tôi thực sự đã tìm kiếm tính năng "đánh dấu là trùng lặp". Tôi đã không tìm thấy nó, vì vậy tôi đã đăng. Làm nghiên cứu thêm kể từ khi bình luận của bạn, tôi phát hiện ra tôi không có đủ danh tiếng để gắn cờ các câu hỏi: http://meta.stackexchange.com/questions/118124/where-on-earth-is-the-mark-duplicate-ui-on -stack-overflow Cảm ơn lời khuyên và tôi xin lỗi về spam. – stefanmaric
Yêu cầu nào? Câu đầu tiên đặt câu hỏi cần thiết là 1,5 giờ, câu thứ hai cung cấp một bài đăng trên blog với thông tin về cách thực hiện nó cứ 1,5 giờ một lần. – vfilby
Được thăng hạng vì bài đăng trên blog trả lời đúng câu hỏi. –
Nó không tham chiếu rõ ràng khi tôi bỏ phiếu bầu. Nó đã được chỉnh sửa kể từ khi làm cho nó rõ ràng rằng liên kết là một giải pháp tiềm năng cho câu hỏi 90 phút. – Alnitak