运行cron后Bash空变量,但手动运行

时间:2016-08-01 11:36:44

标签: linux bash variables cron

我有一个简单的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 为空?如何解决?

1 个答案:

答案 0 :(得分:4)

限定/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预先。当你真的只运行一个print语句时,这并没有显着区别,但是如果你将这个脚本扩展为多个,那么打开输出文件只比打开一个文件更有效率而不是每次重新打开它你有时间写点什么。