У меня есть странная проблема с $RANDOM в кроне. Я хочу выполнить команду случайное число минут после огней cronjob.
Этот пример работает непосредственно в терминале и задерживает команду до 30 секунд (команда замены с тем, что Вы хотите, это - на самом деле эхо к/dev/ttyUSB0):
sleep `expr $RANDOM \% 30` ; command
Если та же строка помещается в crontab, команда всегда сразу стреляет без задержки:
* * * * * sleep `expr $RANDOM \% 30` ; command
Если я использую выражение без $RANDOM, это хорошо работает - это делает задержку 15 secs:
* * * * * sleep `expr 10 + 5` ; command
Другими словами, кажется, что $RANDOM не работает в кроне.
Но это не просто, потому что сам $RANDOM оценивает для обнуления, потому что затем это должно дать задержку 10:
* * * * * sleep `expr $RANDOM \% 30 + 10` ; command
Я также попробовал && instread; но это не помогает. На самом деле затем команда не стреляет вообще!
Я мог, конечно, поместить задержку сценария, который затем называют от crontab, но это не объясняет мою проблему и не заставляет меня учиться :-)
Это - Debian Lenny, если это имеет какое-либо значение.
cron
использование /bin/sh
оболочка для выполнения задач. В некоторых дистрибутивах это - символьная ссылка на dash
. Ни один из них не поддерживает $RANDOM
переменная, которая является a bash
- определенное расширение.
С vixie-кроном можно поместить строку SHELL=/bin/bash
наверху Вашего crontab.
Иначе необходимо будет обосноваться с bash -c 'echo $RANDOM'
или perl -e 'print int(rand(65535))'
.
(В вышеупомянутом примере, 65535 максимальное количество для возврата. Можно применить другую математику в сценарии также.)
В правильно настроенной системе Вам сообщили бы об этом cron
самостоятельно – это всегда отправляет вывод задания, включая сообщения об ошибках, по электронной почте. Установите легкий MTA.
Кроме того, в ударе, $(( ))
предпочтен `expr`
.
cron
обычно выполнения с менее "полной" средой, означая, что Вы просто не имеете многие в наличии из тех же переменных среды Вам. По-видимому, $RANDOM
один такой и на самом деле Ваш sleep
команда просто перестала работать с ошибкой из-за неопределенной переменной - который является, почему Вашей команде не удалось работать вообще, когда Вы переключились на &&
вместо ;
. (Ну, на самом деле, $RANDOM
функция Bash, но cron
не работает в полной среде Bash, которая очевидно испытывает недостаток в этой функции.)
Для выполнения этой задачи необходимо будет использовать отдельный сценарий Bash, как Вы сказали. С другой стороны, Вы смогли выяснять способ использовать cat /dev/urandom
непосредственно в cron
команда, но, вероятно, было бы легче только переместить то, что Вы в настоящее время имеете к отдельному сценарию Bash.