Проблема с $RANDOM в crontab

У меня есть странная проблема с $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, если это имеет какое-либо значение.

8
задан 30.03.2011, 21:13

2 ответа

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`.

15
ответ дан 07.12.2019, 13:52

cron обычно выполнения с менее "полной" средой, означая, что Вы просто не имеете многие в наличии из тех же переменных среды Вам. По-видимому, $RANDOM один такой и на самом деле Ваш sleep команда просто перестала работать с ошибкой из-за неопределенной переменной - который является, почему Вашей команде не удалось работать вообще, когда Вы переключились на && вместо ;. (Ну, на самом деле, $RANDOM функция Bash, но cron не работает в полной среде Bash, которая очевидно испытывает недостаток в этой функции.)

Для выполнения этой задачи необходимо будет использовать отдельный сценарий Bash, как Вы сказали. С другой стороны, Вы смогли выяснять способ использовать cat /dev/urandom непосредственно в cron команда, но, вероятно, было бы легче только переместить то, что Вы в настоящее время имеете к отдельному сценарию Bash.

1
ответ дан 07.12.2019, 13:52

Теги

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