Shell脚本从命令行运行,但不从cron运行。

3

我有一个脚本,每天更新服务器的一些统计数据。当从命令行运行脚本时,脚本按预期工作,但是当从cron运行时,某些变量未传递给curl。

以下是代码示例:

#!/bin/sh
PATH=/bin:/sbin:/usr/bin:/usr/sbin
/bin/sh /etc/profile

MACADDR=$(ifconfig en0 | grep ether | awk '{print $2}')
DISKUSED=$(df / | awk '{print $3}' | tail -n1)
DISKSIZE=$(df / | awk '{print $2}' | tail -n1)

# HTTP GET PARAMS
GET_DELIM="&"
GET_MAC="macaddr"
GET_DS="disk_size"
GET_DU="disk_used"

# Put together the query
QUERY1=$GET_MAC=$MACADDR$GET_DELIM$GET_DS=$DISKSIZE$GET_DELIM$GET_DU=$DISK_USED

curl http://192.168.100.150/status.php?$QUERY1

这个cron job的结果是 http://192.168.100.150/status.php?macaddr=&disk_size=&disk_used=

我不确定是变量出了问题,还是awk试图解析没有终端大小的数据,等等。

非常感谢任何帮助。


1
UPWGFBA -- 无用的管道,带有grep和awk :-) 更好的方式:MACADDR=$(ifconfig en0 | awk '/ether/ {print $2}') - Jens
3个回答

7
当你遇到这样的问题时,几乎总是环境问题。将“env”的结果转储到文件中并检查。您还可以在脚本的顶部行运行它。
#!/bin/sh -x

为了查看所有变量的情况,您可能需要使用包装脚本,以便可以重定向提供的输出进行分析。


4

你的脚本中第一个命令 ifconfig 可以在 Mac 上的 /sbin/ifconfig 找到。而 cron 作业的默认 PATH 变量设置为:/usr/bin:/bin 这可能是剩下的命令也无法执行的原因。

最好在脚本顶部手动设置 PATH。例如:

export PATH=$PATH:/sbin

非常抱歉,这已经在脚本中尝试过了,但没有成功。当我简化代码以在此处发布时,不小心忽略了它。 - David Houde

2

我在使用cron时遇到的一个问题是一些你认为理所当然的变量不存在。其中最主要的一个是路径变量。

在命令行中运行时,输出你设置的路径,并将其放在脚本的顶部(或者放在crontab文件的顶部)。

或者,指定每个命令的完整路径 - ifconfig、awk、grep等。

我想这样做可以解决问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接