crontab 中的 $RANDOM 问题

crontab 中的 $RANDOM 问题

我在 cron 中遇到了一个奇怪的问题,即 $RANDOM。我希望在 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

我也尝试过用 && 代替 ; 但这没有用。事实上,命令根本就不会触发!

我当然可以将延迟放在脚本中,然后从 crontab 调用,但这并不能解释我的问题,也不能让我学到东西:-)

如果有什么区别的话,那就是 Debian Lenny。

答案1

cron使用/bin/shshell 执行任务。在某些发行版中,这是 的符号链接dash。它们都不支持$RANDOM变量,这是一个bash特定于 的扩展。

  • SHELL=/bin/bash使用 vixie-cron,您可以在 crontab 的顶部放置一行。

  • 否则,您将必须接受bash -c 'echo $RANDOM'perl -e 'print int(rand(65535))'

    (在上面的例子中,65535 是返回的最大数字。您也可以在脚本中应用其他数学运算。)

  • 在正确配置的系统中,系统会自动通知您这一点cron- 它始终通过电子邮件发送作业输出(包括错误消息)。安装轻量级 MTA。


此外,在 bash 中,$(( ))比 更受欢迎`expr`

答案2

cron通常在不太“完整”的环境中运行,这意味着您根本没有许多相同的可用环境变量。显然$RANDOM就是这样一个,事实上,您的命令只是因为未定义的变量而失败并出现错误——这就是为什么当您切换到而不是时sleep,您的命令根本无法运行。(嗯,实际上,是一个 Bash 函数,但不在完整的 Bash 环境中运行,显然缺少这个函数。)&&;$RANDOMcron

要完成此任务,您需要使用单独的 Bash 脚本,正如您所说。或者,您可能能够找到一种cat /dev/urandom在命令中直接使用的方法cron,但将当前拥有的内容移动到单独的 Bash 脚本可能更简单。

相关内容