2016-08-01 45 views
2

我有简单bash脚本,在终端工作手册,但cron的后给出了一个空的可变运行。运行的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是空的?如何解决它?

回答

3

合格/usr/bin/nmcli是不够的 - 您还需要从PATH中找到一堆其他工具。

而且,一般而言 - 调试一个cron作业时,安排其标准错误去到一个文件中,就像这样:

#!/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的前期。这并不让当你从字面上只运行一个打印语句显著差异,但如果你会扩展这个脚本有一个以上的,它的效率更高,以打开输出文件只有一个,而不是重新打开它的每一个你有时间写点东西。

+0

我在looog.err.log错误:**(过程:11885):WARNING **:nm_client_get_devices:错误越来越设备:未收到回复。可能的原因包括:远程应用程序未发送回复,消息总线安全策略阻止回复,回复超时过期或网络连接中断。 错误:未找到设备'eth0'。 –

+1

嗯,这是你的错误。为什么'nmcli'将不会从您的系统上运行的cron是不是真的有很大的StackOverflow问题 - 它一定会是一个事实深入调查 - 但我会通过看是否已启用SELinux的开始。如果您将其设置为许可但记录模式,则可以让您找出哪些权限是必需的但不可用。 –

+0

......该错误使得它相当清楚地表明庆典正在它甚至从cron应有的方式,这样的话你没有一个变量捕获的问题,对不对?这里有问题的其他子集吗? –

相关问题