crontab 中 $RANDOM 的问题

mar*_*lar 10 linux cron

我在 cron 中遇到了 $RANDOM 一个奇怪的问题。我希望在 cronjob 触发后随机数分钟执行命令。

此示例直接在终端中运行并将命令延迟最多 30 秒(将命令替换为您想要的任何内容,它实际上是对 /dev/ttyUSB0 的回显):

sleep `expr $RANDOM \% 30` ; command
Run Code Online (Sandbox Code Playgroud)

如果在 crontab 中放置了同一行,则该命令始终会立即触发而不会延迟:

* * * * * sleep `expr $RANDOM \% 30` ; command
Run Code Online (Sandbox Code Playgroud)

如果我使用没有 $RANDOM 的表达式,它工作正常 - 这会延迟 15 秒:

* * * * * sleep `expr 10 + 5` ; command
Run Code Online (Sandbox Code Playgroud)

换句话说,似乎 $RANDOM 在 cron 中不起作用。

但这不仅仅是因为 $RANDOM 本身的计算结果为零,因为这应该会延迟 10:

* * * * * sleep `expr $RANDOM \% 30 + 10` ; command
Run Code Online (Sandbox Code Playgroud)

我也尝试过使用 && instread ; 但这无济于事。事实上,那么该命令根本不会触发!

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

如果这有什么不同,那就是 Debian Lenny。

use*_*686 19

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

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

  • 否则,您将不得不使用bash -c 'echo $RANDOM'或来解决perl -e 'print int(rand(65535))'

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

  • 在正确配置的系统中,您会被cron自己告知这一点——它总是通过电子邮件发送作业输出,包括错误消息。安装轻量级 MTA。


此外,在 bash 中,$(( ))优先于`expr`.