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

San*_*nex 2 linux variables bash 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
Run Code Online (Sandbox Code Playgroud)

跑: /bin/bash /test.bash

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

1 monday 2016 14:17:36 +0300 =- 23.18.117.254 -= 
Run Code Online (Sandbox Code Playgroud)

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

*/1 * * * * root /bin/bash /test.bash
Run Code Online (Sandbox Code Playgroud)

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

1 monday 2016 14:19:13 +0300 =-  -=
Run Code Online (Sandbox Code Playgroud)

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

Cha*_*ffy 5

限定/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 -= "
Run Code Online (Sandbox Code Playgroud)

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

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