Eval到变量失败(带有Crontab)

时间:2009-11-11 12:26:18

标签: bash shell cron eval crontab

这是我正在编写的用于记录CPU负载的bash脚本的片段:

#!/bin/bash
# ... irrelevant nonsense ...
cmd1="/usr/bin/mpstat -P ALL | egrep '(AM|PM)([[:space:]]+)(0)' | tr -s ' ' | cut -d' ' -f4"
ldsys="$(echo $cmd1 | /bin/sh)"
# ... irrelevant nonsense ...
当脚本以常规方式从控制台执行时,

$ldsys已正确设置。这是金色的。 以下是问题:使用crontab执行时,$ldsys为空。

过去三个小时我一直在尝试数以百万计的事情,试图让这件事工作......但我找不到任何东西。有没有人有任何想法?


说明:

  • /usr/bin/mpstat 可以执行 cron的。我通过添加伪造任务来测试每分钟:/usr/bin/mpstat -P ALL >> somefile并检查输出。它有效。

  • egreptrcut在cron下运行正常。

  • 我认为它确实与eval赋值约定有关...但我不知道为什么这会是一个问题,因为它是一个相对基础的构造... 之后尝试亚当的建议,我现在不知道该怎么想......

修改:删除eval使用情况......仍然没有骰子。

3 个答案:

答案 0 :(得分:1)

您的问题来自mpstat。当它从命令提示符运行时,它输出AM / PM的时间。它不是由cron运行的。正如 ennuikiller 所建议的那样,这可能是一个环境问题。在我的系统上echo $LANG在命令提示符下给出“en_US.UTF-8”,但在cron中运行时没有。这个或其他一些环境变量正在影响mpstat输出时间的方式,所以当你grep为“(AM | PM)”时它找不到它。

顺便问一下,你为什么不这样做:

ldsys=$(/usr/bin/mpstat ... )

没有分配到“cmd1”,evalecho和管道sh

答案 1 :(得分:0)

您遇到以下两个问题之一:

This is perhaps our number one complaint with cron. When you login to Unix, startup scripts setup your environment. You can see your environment with the commands "printenv" or "env". On the other hand, cron sets up only a sparse environment 

通常,任何程序的输出都会发送到STDOUT(标准输出),并且通常会在某人的显示屏上结束。对于由cron启动的作业,STDOUT将被定向到本地邮件子系统,这意味着由cron作业生成的任何输出都将邮寄给拥有该作业的用户

答案 2 :(得分:0)

您是否尝试过删除eval

而不是

ldsys=`eval $cmd1`

尝试

ldsys=`echo "$cmd1" | /bin/sh`

ldsys="$(echo $cmd1 | /bin/sh)"