这是我正在编写的用于记录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
并检查输出。它有效。
egrep
,tr
和cut
在cron下运行正常。
修改:删除eval
使用情况......仍然没有骰子。
答案 0 :(得分:1)
您的问题来自mpstat
。当它从命令提示符运行时,它输出AM / PM的时间。它不是由cron
运行的。正如 ennuikiller 所建议的那样,这可能是一个环境问题。在我的系统上echo $LANG
在命令提示符下给出“en_US.UTF-8”,但在cron
中运行时没有。这个或其他一些环境变量正在影响mpstat
输出时间的方式,所以当你grep
为“(AM | PM)”时它找不到它。
顺便问一下,你为什么不这样做:
ldsys=$(/usr/bin/mpstat ... )
没有分配到“cmd1”,eval
,echo
和管道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)"