2

这是我正在编写的用于记录 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 分配约定有关......但我不知道为什么这会是一个问题,因为它是一个相对基本的构造......在尝试了亚当的建议之后,我现在不知道该怎么想......

编辑:去掉eval使用......仍然没有骰子。

4

3 回答 3

1

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

顺便说一句,你为什么不这样做:

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

没有分配给“cmd1”、the eval、theecho和管道到sh?

于 2009-11-11T14:24:59.910 回答
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 作业生成的任何输出都将被邮寄给拥有该作业的用户

于 2009-11-11T12:31:06.820 回答
0

你试过消除eval吗?

代替

ldsys=`eval $cmd1`

尝试

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

或者

ldsys="$(echo $cmd1 | /bin/sh)"
于 2009-11-11T12:53:07.010 回答