Shell脚本从命令行运行,而不是从cron运行



我有一个脚本,每天用一些统计数据更新一次服务器。当从命令行运行时,脚本可以正常工作,但当从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作业的结果是http://192.168.100.150/status.php?macaddr=&disk_size=&disk_used=

我不确定是不是变量有问题,或者可能是awk试图在没有指定终端大小的情况下解析数据,等等。

感谢您的帮助。

遇到这样的问题时,几乎总是环境问题。

将"env"的结果转储到一个文件中并进行检查。你也可以用的顶行运行你的脚本

#!/bin/sh -x

看看所有变量都发生了什么。您可能希望使用包装器脚本,以便重定向它提供的用于分析的输出。

脚本中的第一个命令ifconfig位于Mac上的/sbin/ifconfig中。cron作业的默认PATH变量设置为:/usr/bin:/bin这就是您的其他命令可能也失败的原因。

最好在脚本顶部手动设置PATH。类似于:

export PATH=$PATH:/sbin

我在使用crons时遇到的一个问题是,您认为理所当然的变量不存在。您认为理所当然的主要变量是路径变量。

从命令行运行时,回显您设置的路径,并将其放在脚本的顶部(或crontab的顶部)。

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

我想这会解决问题的。

最新更新