Задание крона, случайный запуск, но в течение периода времени

Я изменил немного сценария оболочки:

#!/bin/sh
#
# Startup script for Tomcat
#

JAVA_HOME="/usr/java/jdk1.7.0_09" ;
JRE_HOME=/usr/java/jdk1.7.0_09/jre;
CATALINA_HOME=/java/tomcat-7.0.27;
export JAVA_HOME && export JRE_HOME &&$CATALINA_HOME/bin/startup.sh &&$CATALINA_HOME/bin/shutdown.sh

case "$1" in
start)
echo -n "Starting Tomcat"
su - tomcat -c $CATALINA_HOME/bin/startup.sh
;;
stop)
echo -n "Stopping Tomcat"
su - tomcat -c $CATALINA_HOME/bin/shutdown.sh
;;
restart)
$0 stop
$0 start
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
esac

exit 0

Затем вставьте его

/etc/rc.d/init.d

Добавленный права работать:

# chmod +x /etc/init.d/ tomcat

Добавленные символьные ссылки:

ln -s /etc/init.d/tomcat /etc/rc0.d/K91tomcat
ln -s /etc/init.d/tomcat /etc/rc1.d/K91tomcat
ln -s /etc/init.d/tomcat /etc/rc2.d/S91tomcat
ln -s /etc/init.d/tomcat /etc/rc3.d/S91tomcat
ln -s /etc/init.d/tomcat /etc/rc4.d/S91tomcat
ln -s /etc/init.d/tomcat /etc/rc5.d/S91tomcat
ln -s /etc/init.d/tomcat /etc/rc6.d/K91tomcat

Теперь все хорошо.

reboot;

catalina.out:

...
INFO: Server startup in 113947 ms

Большое спасибо!

11
17.01.2015, 20:45
3 ответа

Никогда не видел реализации cron, которая бы позволяла выполнять задания в случайное время. Это странное требование. Как говорится в документации, 9-12 - это сокращение для 9,10,11,12, и означает каждый час с 9 до 12.

Если необходимо выполнить задание в произвольное время, запустите задание в начале интервала и добавьте произвольную задержку. Например, чтобы запустить задание в случайное время от 9 до 12:

SHELL=/bin/bash
0 9 * * * sleep $((3600 * (RANDOM % 4))); do_stuff

Обратите внимание, что RANDOM требует bash или ksh, он может быть недоступен в оболочке по умолчанию.

Если вы хотите работать в случайное время между 9 и 12:

SHELL=/bin/bash
0 9 * * * sleep $((3600 * (RANDOM % 4))); do_stuff

, со вторым разрешением, вы можете использовать RANDOM % 10800 в качестве задержки, но так как RANDOM находится в диапазоне 0...32767, будет иметь место смещение в сторону задержек между 0 и 32768 % 10800 = 368. Чтобы избежать этого смещения:

SHELL=/bin/bash
0 9 * * * max=$((32768/10800*10800)); while delay=$RANDOM; ((delay > max)); do :; done; sleep $((delay % 10800)); do_stuff
7
27.01.2020, 19:59

В итоге я столкнулся с аналогичным требованием для скриптов Python, но в итоге реализовал его через сам скрипт, используя функции random + sleep, а затем запуская задание cron в полночь

from time import sleep
import random

sleep_time = random.randint(0,7200)  #7200 seconds = 2 hours * 60 min * 60 sec
print(sleep_time)
sleep(sleep_time)
2
05.04.2020, 08:19

Большинство этих ответов основаны на не -переносимых функциях или башизмах -, так как вы просили тире, вот переносимое решение:

0 9 * * * sleep $(echo | awk '{print rand()*3600*3};') && whatever_you_wanted_to_do

Здесь используются только утилиты и синтаксис, которые гарантированно существуют в POSIX, и должны работать в любой UNIX даже при минимальной установке.

0
20.04.2020, 10:09

Теги

Похожие вопросы