Necesito la capacidad de ejecutar un script PHP 20 veces al día en momentos completamente aleatorios. También quiero que se ejecute solo entre las 9 a.m. y las 11 p.m.
Estoy familiarizado con la creación de trabajos cron en Linux.
Necesito la capacidad de ejecutar un script PHP 20 veces al día en momentos completamente aleatorios. También quiero que se ejecute solo entre las 9 a.m. y las 11 p.m.
Estoy familiarizado con la creación de trabajos cron en Linux.
Respuestas:
Si entiendo lo que está buscando, tendrá que hacer algo un poco complicado, como tener un trabajo cron que ejecuta un script bash que aleatoriza los tiempos de ejecución ... Algo como esto:
crontab:
0 9 * * * /path/to/bashscript
y en / ruta / a / bashscript:
#!/bin/bash
maxdelay=$((14*60)) # 14 hours from 9am to 11pm, converted to minutes
for ((i=1; i<=20; i++)); do
delay=$(($RANDOM%maxdelay)) # pick an independent random delay for each of the 20 runs
(sleep $((delay*60)); /path/to/phpscript.php) & # background a subshell to wait, then run the php script
done
Algunas notas: este enfoque es un poco desperdicio de recursos, ya que dispara 20 procesos en segundo plano a las 9 a.m., cada uno de los cuales espera un número aleatorio de minutos (hasta 14 horas, es decir, 11 p.m.), luego inicia el script php y salidas. Además, dado que usa un número aleatorio de minutos (no segundos), las horas de inicio no son tan aleatorias como podrían ser. Pero $ RANDOM solo sube a 32,767, y hay 50,400 segundos entre las 9 am y las 11 pm, sería un poco más complicado aleatorizar los segundos también. Finalmente, dado que las horas de inicio son aleatorias e independientes entre sí, es posible (pero no muy probable) que dos o más instancias del script se inicien simultáneamente.
((maxdelay = 14 * 60))
o ((delay = $RANDOM % maxdelay))
). El sleep
argumento aún debe ser como lo tiene (aunque puede agregar espacios, si lo desea).
sleep $[ ( $RANDOM % 60 ) + 1 ]s && some_script.sh
Sí, sí, la pregunta tiene más de un año, pero tal vez pueda agregar algo útil:
¿Cómo cronometrar algo con un desplazamiento aleatorio 20 veces al día entre las 9 a.m. y las 11 p.m.? Eso es un poco complicado dentro de cron, porque estás dividiendo 14 horas entre 20 tiempos de ejecución. No me gustan mucho las otras respuestas porque requieren escribir un script bash wrapper para su script php.
Sin embargo, si me permite la libertad de facilitar la restricción de tiempo y frecuencia a 13 veces entre las 8:30 am y las 11:09 pm, esto podría funcionar, y todo dentro de los límites de su crontab:
30 8-21/* * * * sleep ${RANDOM:0:2}m ; /path/to/script.php
$ {RANDOM: 3: 2} usa $ RANDOM de bash que otras personas han mencionado anteriormente, pero agrega la división de matrices de bash. Dado que las variables de bash no están tipificadas, el número de 16 bits con signo pseudoaleatorio se trunca a los primeros 2 de sus 5 dígitos decimales, lo que le brinda una breve línea para retrasar su cronjob entre 10 y 99 minutos (aunque la distribución está sesgada hacia 10 a 32).
Lo siguiente también podría funcionar para usted, pero descubrí que es "menos aleatorio" por alguna razón (quizás la Ley de Benford se activa al modular números pseudoaleatorios. Oye, no sé, fallé en matemáticas ... en bash!):
30 8-21/* * * * sleep $[RANDOM\%90]m ; /path/to/script.php
Necesita representar el módulo como '\%' arriba porque cron (bueno, al menos Linux 'vixie-cron') termina la línea cuando encuentra un '%' sin escape.
Tal vez podría obtener las 7 ejecuciones de script restantes allí agregando otra línea con otro rango de 7 horas. O relaje su restricción para correr entre las 3 am y las 11 pm.
$[(RANDOM/368)+10]
?
$((RANDOM % 90 + 10))
Prueba:for i in {0..9999}; do echo $((RANDOM % 90 + 10)); done | sort | uniq -c
$RANDOM
: sleep $(( $(od -N1 -tuC -An /dev/urandom) \% 90 ))m
.
crontab
usarlo bash
antes de usarlo $RANDOM
. Si lo tiene vixie-cron
(parece ser mi caso en Ubuntu), puede agregarlo SHELL=/bin/bash
a la parte superior. Hay más alternativas para otras versiones de cron aquí: superuser.com/a/264541/260350
crontab: errors in crontab file, can't install. Do you want to retry the same edit?
ayuda
Entonces estoy usando lo siguiente para ejecutar un comando entre 1AM y 330AM
0 1 * * * perl -le 'sleep rand 9000' && *command goes here*
Eso se ha ocupado de mis necesidades al azar por mí. Eso es 9000 segundos == 150 minutos == 2.5 horas
Cron ofrece una RANDOM_DELAY
variable. Consulte crontab(5)
para obtener más detalles.
La variable RANDOM_DELAY permite retrasar el inicio de trabajos por una cantidad aleatoria de minutos con un límite superior especificado por la variable.
Esto se ve comúnmente en anacron
trabajos, pero también puede ser útil en a crontab
.
Es posible que deba tener cuidado con esto si tiene algunos trabajos que se ejecutan con una granularidad fina (minuto) y otros que son gruesos.
RANDOM_DELAY
se establece una vez y permanece constante durante todo el tiempo de ejecución del demonio.
RANDOM_DELAY
bandera es una característica de cronie-crond mientras que Ubuntu parece estar ejecutándose vixie-cron
y carece de esta bandera.
Mi primer pensamiento sería crear un trabajo cron lanzando 20 trabajos programados al azar. La at
utilidad (http://unixhelp.ed.ac.uk/CGI/man-cgi?at) se utiliza para ejecutar comandos en el momento especificado.
Terminé usando sleep $(( 1$(date +%N) % 60 )) ; dostuffs
(compatible con bash & sh)
El prefijo 1 es para forzar una interpretación NO base 8 de la fecha +% N (por ejemplo, 00551454)
No olvide escapar% usando \% en un archivo crontab
* * * * * nobody sleep $(( 1$(date +\%N) \% 60 )) ; dostuffs
date
(lo que probablemente lo haga en la mayoría de los Linux, pero no en Busybox, MacOS estándar o varias otras plataformas derivadas de BSD).
La solución de al-x no me funciona ya que los comandos crontab no se ejecutan en bash sino en sh, supongo. Lo que funciona es:
30 8 * * * bash -c "sleep $[RANDOM\%90]m" ; /path/to/script.py
$[ ... ]
está en desuso la sintaxis desde waaaay atrás; para cualquier cosa de este milenio, preferiría $((RANDOM\%90))m
que sea una sintaxis compatible con POSIX (pero, por supuesto, RANDOM
sigue siendo solo Bash).
at -f [file] [timespec]
o
echo [command] | at [timespec]
o
at [timespec]
... y especificación interactiva como script
la grabación.
En se ejecuta el texto provide en stdin o en el archivo especificado por -f [file]
.
Aquí está la [timespec]
gramática . Puede ser algo como:
0100
. Ej . 2359
,1620
now + 10 minutes
2071-05-31 - 5 hours 12 minutes UTC
Si especifica explícitamente la zona horaria, es posible que algunas versiones de la especificación de tiempo solo permitan UTC
el argumento de zona horaria opcional.
cat script.sh | at now + $(($RANDOM % 10)) hours $(($RANDOM % 60)) minutes
at -f script.sh now + $(($RANDOM % 10)) hours $(($RANDOM % 60)) minutes
Puede probar el análisis de bash pre-pendiente echo
y escapando del |
(pipe).
echo cat script.sh \| at now + $(($RANDOM % 10)) hours $(($RANDOM % 60)) minutes
echo at -f script.sh now + $(($RANDOM % 10)) hours $(($RANDOM % 60)) minutes
Para ver los trabajos programados, use atq
y el contenido del trabajo (variables de entorno, configuración y comando / script) con at -c [jobid]
.
El sistema es parte de cron, y el indicador interactivo realmente captura todo el estado actual de su shell, por lo que puede ejecutar comandos sin especificar rutas absolutas.
Para aquellos que buscaron en Google el camino aquí:
Si está utilizando anacron (Ubuntu de escritorio y portátil), puede editar
/etc/anacrontab
y añadir
RANDOM_DELAY=XX
Donde XX es la cantidad de minutos que desea retrasar el trabajo base.
Anacron es como cron, pero no espera que su computadora esté en funcionamiento las 24 horas, los 7 días de la semana (como nuestras computadoras portátiles) y ejecutará los scripts que omitió porque el sistema no funcionaba.
Puede intentar con este ejemplo usar tiempos aleatorios antes de ejecutar el comando:
#!/bin/bash
# start time
date +"%H:%M:%S"
# sleep for 5 seconds
sleep $(shuf -i 1-25 -n 1)
# end time
date +"%H:%M:%S"
¿Qué tal crear un script que reescriba el crontab todos los días?
Me doy cuenta de que es un hilo más antiguo, pero quiero agregar una cosa relacionada con el valor aleatorio que uso mucho. En lugar de usar la variable $ RANDOM con un rango fijo y limitado, a menudo hago valores aleatorios de rango arbitrario en el shell con
dd if=/dev/urandom bs=4 count=1 2>/dev/null | od -N4 -t u4 -A none
para que puedas hacer, por ejemplo,
FULLRANDOM=$(dd if=/dev/urandom bs=4 count=1 2>/dev/null | od -N4 -t u4 -A none)
y superar algunas de las restricciones que se discutieron en este hilo.
~$info dd
y puedo entender lo que está pasando en el lado izquierdo |
, pero no puedo distinguir el lado derecho. Entonces, para mí y para otros interesados enovercoming some restrictions
la generación de valores aleatorios, ¿por qué no tomarse un momento para explicar el RHS y hacer un discurso más fuerte para usar su enfoque? La profundidad de la explicación hace que las personas se sientan cómodas con el proceso que sugiere y sus beneficios. Gracias.