【问题标题】:Bash empty variable after running cron, but runs manually运行 cron 后 Bash 空变量,但手动运行
【发布时间】:2016-08-01 11:36:44
【问题描述】:

我有简单的 bash 脚本,该脚本在终端上工作手册,但在 cron 之后给出了一个空变量。

#!/bin/bash 
gwip=`/usr/bin/nmcli dev list iface eth0 | grep IP4-SETTINGS.GATEWAY: | awk '{ print $2}'`
printf '%s\n' "$(date) =- $gwip -= " >> /var/log/looog.log

运行:/bin/bash /test.bash

在文件 /var/log/looog.log 中输出:

1 monday 2016 14:17:36 +0300 =- 23.18.117.254 -= 

当我运行 cron 时,变量为空。

*/1 * * * * root /bin/bash /test.bash

在文件 /var/log/looog.log 中输出:

1 monday 2016 14:19:13 +0300 =-  -=

为什么变量 $gwip 是空的?如何解决?

【问题讨论】:

    标签: linux bash variables cron


    【解决方案1】:

    限定 /usr/bin/nmcli 是不够的 - 您还调用了一堆其他需要从 PATH 中找到的工具。

    另外,一般来说——在调试 cron 作业时,安排它的 stderr 转到一个文件,如下所示:

    #!/bin/bash
    
    # log stdout and stderr to two different files
    exec >>/var/log/looog.log 2>>/var/log/looog.err.log
    
    # ...and log every command we try to execute to stderr (aka looog.err.log)
    set -x
    
    # set a PATH variable
    export PATH=/bin:/usr/bin
    
    # original code here, using modern POSIX $() syntax, vs old hard-to-nest ``
    gwip=$(nmcli dev list iface eth0 | awk '/IP4-SETTINGS[.]GATEWAY:/ { print $2}')
    printf '%s\n' "$(date) =- $gwip -= "
    

    这里的关键是明确设置的 PATH(没有您期望在 PATH 中设置的值是 cron 作业中的常见问题)和 stderr 日志(确保可以通过读取其内容来识别任何其他问题)。

    请注意预先使用单个重定向到looog.log。当您实际上只运行一个打印语句时,这不会产生显着差异,但是如果您将此脚本扩展为具有多个,那么只打开一个输出文件比每次都重新打开它更有效到时候你有东西要写了。

    【讨论】:

    • 我在 looog.err.log 中有错误:**(进程:11885):警告**:nm_client_get_devices:获取设备时出错:没有收到回复。可能的原因包括:远程应用程序未发送回复、消息总线安全策略阻止回复、回复超时或网络连接中断。错误:找不到设备“eth0”。
    • 嗯,这是你的错误。为什么nmcli 不会在您的系统上从 cron 运行并不是一个很好的 StackOverflow 问题——它必然是一项事实密集型调查——但我会先看看你是否启用了 SELinux。如果您将其设置为 permissive-but-logging 模式,这将使您能够找出哪些权限需要但不可用。
    • ...这个错误很清楚地表明 bash 的工作方式甚至是从 cron 开始的,因此您没有变量捕获问题,对吧?范围内是否还有其他问题的子集?
    • 我运行“setenforce 0”并且脚本运行良好。所以SELinux中的问题。现在我要为 SELinux 创建一个规则。谢谢!
    • 很高兴为您提供帮助!顺便说一句,我刚刚进行了编辑以将grepawk 组合在一起——没有理由将它们作为单独的命令。 (在 grep 中实际上也需要从 . 更改为 [.],以防止 . 充当通配符)。
    猜你喜欢
    • 2010-12-23
    • 1970-01-01
    • 1970-01-01
    • 2014-12-05
    • 2019-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-14
    相关资源
    最近更新 更多