Shell脚本在crontab上无法正常工作,在手动调用时可以正常工作

时间:2012-02-20 09:35:43

标签: shell variables crontab sh

我在Solaris 5.8下有一个脚本,它没有按预期工作,并且不知道为什么......

该脚本从文件中读取URL列表,使用curl测试它们并将输出写入日志文件:

#!/bin/sh

# Logs path
LOG_DIR=/somedir/logs

# URLs file path
URL_FILE=/somedir/url

# Actual date
DATE=`date +%Y%m%d%H%M`

# CURL
CURL=/somedir/bin/curl

test_url()
{
    cat $URL_FILE | grep -i $1 | while read line
    do
        NAME=`echo $line | awk '{ print $1 }'`
        URL=`echo $line | awk '{ print $2 }'`
        TIME=`$CURL -s -o /dev/null -w %{time_total} $URL`
        echo "$DATE $TIME" >> $LOG_DIR/${NAME}_${1}.log
    done
}

test_url someurl
test_url someotherurl

URL_FILE具有以下布局:

somename1 http://someurl/test
somename2 http://someotherurl/test

脚本从文件加载URL,然后使用curl获取URL加载所需的总时间,然后打印日期和时间(以毫秒为单位)。我发现的问题是变量TIME在crontab中调用时不起作用,但是当用户自己调用它时它会起作用:

# Output when called with the user ./script.sh
201202201018 0.035
# Output when called from crontab.
201202201019

如果我重定向所有输出* * * * * /path/to/script/script.sh 1&2 > /tmp/output,则输出文件为空。

此外,我还没有在/ var / log / syslog中看到任何关于它的输出。通过crontab调用TIME变量未正确显示的任何线索?

1 个答案:

答案 0 :(得分:5)

你应该看看的东西:

  1. 你的cron中/path/to/script/script.sh 1&2 > /tmp/output有效吗?在我的机器上,它将运行带有参数“1”的脚本并尝试找到一个名为“2”的程序来运行它。如果找不到它,它会创建一个空的输出文件。我想你正在寻找像/path/to/script/script.sh >> /tmp/output 2>&1
  2. 这样的东西
  3. 您是否将CURL设置为卷曲的完整路径? Cron通常没有相同的路径信息。
  4. 您使用哪个用户来运行cron?是否存在卷曲或网络的访问限制?
  5. %确实由cron处理,如果它是在crontab中写的。它意味着换行,否则应该被转义。你是否直接在cron中使用curl运行测试?只要你在脚本中保留它就可以了。