【问题标题】:Eval to variable failing (w/Crontab)评估变量失败(w/Crontab)
【发布时间】:2016-03-24 03:49:41
【问题描述】:

这是我正在编写的用于记录 CPU 负载的 bash 脚本的 sn-p:

#!/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 -P ALL >> somefile 并检查输出。它有效。

  • egreptrcut 在 cron 下都可以正常工作。

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

编辑:去掉了eval的用法...仍然没有骰子。

【问题讨论】:

标签: bash shell cron eval crontab


【解决方案1】:

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

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

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

没有分配给“cmd1”、evalechosh 的管道?

【讨论】:

    【解决方案2】:

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

    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 分配之外的一切正常。
    • 您是否检查了 crons 邮件以查看输出中是否有任何错误?也许你的 PATH inst 你认为它是什么
    【解决方案3】:

    您是否尝试过消除eval

    代替

    ldsys=`eval $cmd1`
    

    试试

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

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

    【讨论】:

    • 奇怪...这两个最终也是空的...:S
    猜你喜欢
    • 1970-01-01
    • 2018-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-14
    • 1970-01-01
    • 2020-09-16
    • 2016-06-12
    相关资源
    最近更新 更多