2011-05-26 167 views
2

我有一个脚本,每天更新一次服务器的一些统计信息。从命令行运行时,该脚本按预期工作,但从cron运行时,某些变量不会传递给curl。Shell脚本从命令行运行,而不是cron

下面是代码的例子:我不知道

#!/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试图解析没有指定终端大小的数据等。

任何帮助表示赞赏。

+1

UPWGFBA - 无用管道使用grep随后AWK :-)更好:'MACADDR = $(使用ifconfig了en0 | awk的 '/醚/ {打印$ 2}')' – Jens 2011-08-29 12:24:14

回答

7

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

将“env”的结果转储到文件并检查。你也可以用

#!/bin/sh -x 

顶线运行脚本,看看发生了什么所有的变量。您可能想要使用包装脚本,以便您可以重定向提供用于分析的输出。

2

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

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

或者,指定的完整路径,每个命令 - 使用ifconfig时,aw​​k,grep的,等

我猜,这将解决这个问题。

4

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

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

export PATH=$PATH:/sbin 
+0

我不道歉,这已经在脚本中完成了,但没有运气。简化代码在这里发布时,我不小心省略了它。 – 2011-05-27 12:26:52

相关问题