8

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

2 ответа2

15

cron использует оболочку /bin/sh для выполнения задач. В некоторых дистрибутивах это символическая ссылка на dash . Ни один из них не поддерживает переменную $RANDOM , которая является специфичным для bash расширением.

  • С помощью vixie-cron вы можете поместить строку SHELL=/bin/bash вверху вашего crontab.

  • В противном случае вам придется выполнить bash -c 'echo $RANDOM' или perl -e 'print int(rand(65535))' .

    (В приведенном выше примере 65535 является максимальным числом для возврата. Вы также можете применить другую математику внутри скрипта.)

  • В правильно сконфигурированной системе вы были бы проинформированы об этом самим cron - он всегда отправляет выходные данные задания, включая сообщения об ошибках, по электронной почте. Установите легкий MTA.


Кроме того, в bash $(( )) предпочтительнее, чем `expr` .

1

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .