Tengo un problema extraño con $ RANDOM en cron. Deseo ejecutar un comando un número aleatorio de minutos después de que se active el cronjob.
Este ejemplo funciona directamente en el terminal y retrasa el comando hasta 30 segundos (reemplace el comando con lo que quiera, en realidad es un eco para / dev / ttyUSB0):
sleep `expr $RANDOM \% 30` ; command
Si se coloca la misma línea en crontab, el comando siempre se dispara inmediatamente sin demora:
* * * * * sleep `expr $RANDOM \% 30` ; command
Si uso una expresión sin $ RANDOM, funciona bien, esto demora 15 segundos:
* * * * * sleep `expr 10 + 5` ; command
En otras palabras, parece que $ RANDOM no funciona en un cron.
Pero no es simplemente porque $ RANDOM mismo se evalúa a cero, porque entonces esto debería dar un retraso de 10:
* * * * * sleep `expr $RANDOM \% 30 + 10` ; command
También he intentado con && instread of; Pero eso no ayuda. De hecho, entonces el comando no se dispara en absoluto.
Por supuesto, podría colocar el retraso en un script que luego se llama desde crontab, pero eso no explica mi problema y no me hace aprender :-)
Es Debian Lenny si eso hace alguna diferencia.
/bin/sh
fue que no era un shell real, simplemente un enlace simbólico al shell preferido del sysadmin (típicamente bash o dash) en Debian./bin/sh
(y espere que sea compatible con Bourne Shell). Un ejemplo es lasystem()
función en glibc. Por/bin/sh
lo tanto, generalmente apunta al shell más rápido compatible con Bourne; y el administrador del sistema debe establecer su preferencia en la línea apropiada de / etc / passwd, no imponer esa preferencia en todo el sistemash
abash
, pero no parecía relevante.)/bin/sh
apunta al guión. Hasta ahora, nunca escuché sobre dash. Lo busqué y es una variante ligera de bash. Además, no sabía que cron se ejecutaba en un entorno "lisiado", pero explica varios otros problemas que he tenido en el pasado. Por cierto, comencé a usarlo,$(())
pero como no funcionó, probé todo tipo de variaciones y terminé con loexpr
que, por supuesto, tampoco funcionó. Pero ahí es donde terminé :-) ¿Es posible ejecutar un shell bash normal sin las limitaciones de usobash -c 'xxxx'
? Por cierto, ¿no es posible poner saltos de línea en los comentarios?dash
es un shell. No es más ni menos normal quebash
. Tampoco es una variante. 2) Vea los puntos 1 y 2 en la respuesta.cron
normalmente se ejecuta con un entorno menos "completo", lo que significa que simplemente no tiene muchas de las mismas variables de entorno disponibles. Aparentemente$RANDOM
es uno de esos, y de hecho, susleep
comando simplemente está fallando con un error debido a la variable indefinida, por lo que su comando no se ejecutó en absoluto cuando cambió a en&&
lugar de;
. (Bueno, en realidad,$RANDOM
es una función Bash, perocron
no se ejecuta en un entorno Bash completo, que evidentemente carece de esta función).Para llevar a cabo esta tarea, necesitará usar un script Bash separado, como dijo. Alternativamente, es posible que pueda encontrar una manera de usar
cat /dev/urandom
directamente en elcron
comando, pero probablemente sería más fácil mover lo que tiene actualmente a un script Bash separado.fuente
od -An -N1 -i /dev/urandom
\% 30); comando$RANDOM
no es parte de un entorno "completo". No tiene nada que ver con las variables de entorno establecidas al inicio del proceso. Es una variable especial creada "sobre la marcha" en bash. Su nuevo valor siempre se genera cada vez que se lee la variable. ---cron
por defecto se usa/bin/sh
en sistemas donde/bin/sh
no está vinculadobash
$RANDOM
no funcionará de manera predeterminada.