【问题标题】:Shell script runs from command line, not cronShell 脚本从命令行运行,而不是 cron
【发布时间】:2011-05-27 20:25:51
【问题描述】:

我有一个脚本,它每天一次用一些统计信息更新服务器。从命令行运行时,该脚本按预期工作,但从 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 试图解析未指定终端大小的数据等。

感谢任何帮助。

【问题讨论】:

  • UPWGFBA -- grep 后跟 awk 的无用管道 :-) 更好:MACADDR=$(ifconfig en0 | awk '/ether/ {print $2}')

标签: bash shell cron


【解决方案1】:

当您遇到此类问题时,几乎总是环境问题。

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

的顶行运行您的脚本
#!/bin/sh -x

查看所有变量的情况。您可能希望使用包装脚本,以便可以重定向它提供的输出以供分析。

【讨论】:

    【解决方案2】:

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

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

    export PATH=$PATH:/sbin
    

    【讨论】:

    • 我很抱歉,这已经在脚本中完成了,没有运气。我在简化代码发布到这里时不小心省略了它。
    【解决方案3】:

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

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

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

    我猜这会解决问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-12
      • 2012-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-01
      • 1970-01-01
      • 2010-09-14
      相关资源
      最近更新 更多