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

时间:2011-05-26 16:14:44

标签: bash 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尝试解析没有指定终端大小的数据等等。

感谢任何帮助。

3 个答案:

答案 0 :(得分:7)

当你遇到这样的问题时,它几乎总是一个环境问题。

将“env”的结果转储到文件中并检查它。您还可以使用

的第一行运行脚本
#!/bin/sh -x

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

答案 1 :(得分:4)

在Mac上的ifconfig中找到了脚本/sbin/ifconfig中的第一个命令。并且cron作业的默认PATH变量设置为:/usr/bin:/bin这就是可能其余命令也失败的原因。

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

export PATH=$PATH:/sbin

答案 2 :(得分:2)

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

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

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

我猜这会解决问题。