Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 评估变量失败(带Crontab)_Bash_Shell_Cron_Eval_Crontab - Fatal编程技术网

Bash 评估变量失败(带Crontab)

Bash 评估变量失败(带Crontab),bash,shell,cron,eval,crontab,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设置正

下面是我为记录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
    可以通过 克朗。我通过每分钟添加一个假的任务进行测试:
    /usr/bin/mpstat-pall>>
    somefile
    并检查输出。它起作用了

  • egrep
    tr
    cut
    在cron下所有功能都正常

  • 我想这真的和评估任务约定有关。。。但考虑到这是一个相对基本的结构,我不知道为什么这会成为一个问题。。。在尝试了亚当的建议后,我现在不知道该怎么想

编辑:删除
eval
用法。。。仍然没有骰子。

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

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作业生成的任何输出都将被邮寄给拥有该作业的用户

您是否尝试过消除
eval

而不是

ldsys=`eval $cmd1`
试一试


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

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

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

如果没有分配给“cmd1”,
eval
echo
和管道到
sh

请原谅我的无知:关于如何修复它(获得分配给变量的输出)有什么想法吗?谢谢你的洞察力,我真的很感激。顺便说一句我怀疑这是环境问题,考虑到除了
eval
分配之外,其他一切都正常。您是否检查了crons mail以查看输出中是否有任何错误?也许你的道路和你认为的很奇怪。。。这两个都是空的…:s
ldsys="$(echo $cmd1 | /bin/sh)"
ldsys=$(/usr/bin/mpstat ... )