crontab中的$ RANDOM问题


9

我在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

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

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

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

Answers:


17

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`


最后我检查了一下,/bin/sh这不是一个实际的shell,仅仅是到Debian上sysadmin的首选shell(通常是bash或dash)的符号链接。
Hello71 2011年

1
@ Hello71:这就是我在帖子中所说的。不过,习惯上系统软件会调用/bin/sh(并希望它与Bourne shell兼容)。一个例子是system()glibc中的函数。因此/bin/sh通常指向最快的 Bourne兼容外壳。并且sysadmin应该在/ etc / passwd的相应行中设置其首选项,而不是在整个系统范围内强制执行该首选项
user1686

@ Hello71:...好吧,主要是我在帖子中所说的。(我知道大多数其他发行版都链接shbash,但似乎并不相关。)
user1686 2011年

你是对的,/bin/sh指向破折号。到目前为止,我从未听说过破折号。我查了一下,它是bash的轻量级变体。另外,我不知道cron在“残缺不全”的环境中运行,但是它解释了我过去遇到的各种其他问题。顺便说一句,我开始使用,$(())但是由于它不起作用,我尝试了各种变体,最后得到了expr-当然也不能起作用。但这就是我结束的地方:-)是否有可能运行不受限制的普通bash shell bash -c 'xxxx'?顺便说一句,是否不能在评论中加入换行符?
marlar 2011年

@marlar:1)dash是一个外壳。这不比或多或少是正常的bash。它也不是它的变体。2)参见答案中的第一点和第二点。
user1686 2011年

2

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

要完成此任务,您将需要使用一个单独的Bash脚本,如您所说。另外,您也许可以找到一种cat /dev/urandom直接在cron命令中使用的方法,但是将当前需要的内容移到单独的Bash脚本中可能会更容易。


1
这并不漂亮,但是我找到了与您的建议类似的解决方案:sleep $(expr od -An -N1 -i /dev/urandom\%30); 指挥
marlar

1
$RANDOM不是某些“完整”环境的一部分。它与在流程开始时设置的环境变量无关。它是bash中“即时”创建的特殊变量。每当读取变量时,都会始终生成其新值。--- cron默认情况下会/bin/sh/bin/sh未链接到的系统上使用,因此默认情况下bash $RANDOM将无法使用。
pabouk
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.