У меня странная проблема с $ RANDOM в cron. Я хочу выполнить команду случайное количество минут после того, как cronjob срабатывает.
Этот пример работает непосредственно в терминале и задерживает команду до 30 секунд (замените команду на то, что вы хотите, на самом деле это эхо для / dev / ttyUSB0):
sleep `expr $RANDOM \% 30` ; command
Если в crontab находится одна и та же строка, команда всегда запускается немедленно без задержки:
* * * * * sleep `expr $RANDOM \% 30` ; command
Если я использую выражение без $ RANDOM, оно работает нормально - задержка составляет 15 секунд:
* * * * * sleep `expr 10 + 5` ; command
Другими словами, похоже, что $ RANDOM не работает в cron.
Но это не просто потому, что само значение $ RANDOM равно нулю, потому что тогда это должно дать задержку в 10:
* * * * * sleep `expr $RANDOM \% 30 + 10` ; command
Я также пробовал с && instread of; но это не помогает На самом деле тогда команда вообще не стреляет!
Конечно, я мог бы поместить задержку в скрипт, который затем вызывается из crontab, но это не объясняет мою проблему и не заставляет меня учиться :-)
Это Debian Lenny, если это что-то меняет.
/bin/sh
это не настоящая оболочка, а просто символическая ссылка на предпочитаемую оболочку системного администратора (обычно bash или dash) в Debian./bin/sh
(и ожидает, что оно будет совместимо с оболочкой Bourne). Примером являетсяsystem()
функция в glibc. Поэтому/bin/sh
обычно указывает на самую быструю Bourne-совместимую оболочку; и системный администратор должен установить свое предпочтение в соответствующей строке / etc / passwd, чтобы не применять это предпочтение в масштабеsh
на нихbash
, но это не имело значения.)/bin/sh
указывает на тире. До сих пор я никогда не слышал о тире. Я посмотрел, и это легкий вариант Баш. Кроме того, я не знал, что cron работал в «искалеченной» среде, но это объясняет различные другие проблемы, с которыми я сталкивался в прошлом. Кстати, я начал использовать,$(())
но так как это не сработало, я попробовал всевозможные варианты и в итогеexpr
- что, конечно, тоже не сработало. Но на этом я и закончил :-) Можно ли запустить нормальную оболочку bash без ограниченийbash -c 'xxxx'
? Кстати, это не возможно, чтобы поставить разрывы строк в комментариях?dash
это оболочка. Это не более или менее нормально, чемbash
. Это тоже не вариант. 2) См. Пункты № 1 и № 2 в ответе.cron
обычно работает в менее «полной» среде, что означает, что у вас просто нет многих доступных переменных среды. По-видимому,$RANDOM
это один из такихsleep
случаев , и фактически ваша команда просто терпит неудачу с ошибкой из-за неопределенной переменной - именно поэтому ваша команда вообще не выполнялась, когда вы переключились на&&
вместо;
. (Ну, на самом деле,$RANDOM
это функция Bash, ноcron
она не работает в полной среде Bash, которой явно не хватает этой функции.)Для выполнения этой задачи вам нужно будет использовать отдельный скрипт Bash, как вы сказали. В качестве альтернативы, вы можете найти способ использования
cat /dev/urandom
непосредственно вcron
команде, но, вероятно, будет проще просто перенести то, что у вас есть, в отдельный скрипт Bash.источник
od -An -N1 -i /dev/urandom
\% 30); команда$RANDOM
не является частью какой-то "полной" среды. Это не имеет ничего общего с переменными среды, установленными при запуске процесса. Это специальная переменная, созданная на лету в bash. Его новое значение всегда генерируется всякий раз, когда переменная читается. ---cron
по умолчанию используется,/bin/sh
поэтому в системах, где/bin/sh
нет ссылокbash
$RANDOM
, по умолчанию работать не будет.