Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell脚本在crontab上无法正常工作,在手动调用时可以工作_Shell_Variables_Crontab_Sh - Fatal编程技术网

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

Shell脚本在crontab上无法正常工作,在手动调用时可以工作,shell,variables,crontab,sh,Shell,Variables,Crontab,Sh,我在Solaris 5.8下的sh中有一个脚本无法按预期工作,并且不知道为什么 该脚本从文件中读取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() {

我在Solaris 5.8下的sh中有一个脚本无法按预期工作,并且不知道为什么

该脚本从文件中读取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\u文件具有以下布局:

somename1 http://someurl/test
somename2 http://someotherurl/test
脚本从文件中加载URL,然后使用curl获取加载URL所需的总时间,然后以毫秒为单位打印日期和时间。我发现的问题是,在crontab中调用变量time时,变量time不起作用,但在用户本身调用时,变量time起作用:

# 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调用时间变量时,时间变量显示不正确的原因有何线索?

您应该查看的内容:

/path/to/script/script.sh 1&2>/tmp/output在您的cron中有效吗?在我的机器上,它将运行带有参数1的脚本,并尝试找到一个名为2的程序来运行它。如果找不到它,它将创建一个空输出文件。我想您正在寻找类似/path/to/script/script.sh>>/tmp/output 2>&1的内容 是否将CURL设置为CURL的完整路径?Cron通常没有与您相同的路径信息。 您使用哪个用户运行cron?对curl或网络是否有访问限制? %如果是在crontab中编写的,cron确实会以不同的方式处理它。它意味着换行,否则应该转义。您是否直接在cron中使用curl运行测试?只要你把这个放在剧本里,你就会没事的。
总时间是什么意思?它是一个环境变量吗?或者某个旋度参数?它是一个旋度参数,通过-w write out传递。其定义为:time_total:整个操作持续的总时间,以秒为单位。时间将以毫秒分辨率显示。使用./script.shAre调用时,示例中的结果为0.035 ms。您确信/bin/sh的工作原理与手动运行此命令的shell完全相同吗?是的,从sh运行./script.sh本身不会出现问题。我尝试加载sh和/bin/sh,然后运行脚本。输出是一样的,它工作。@J.F.Sebastian谢谢!你当然是对的。我跟踪这件事太久了,最后把两个人搞糊涂了我现在完全重写了这句话。好吧,问题似乎是通过crontab运行的路径找不到libcurl.so.2,但我尝试了PATH=$PATH:/new/PATH/libcurl.so.2;在sh脚本中导出没有运气的路径。在调用脚本时,有没有关于如何导出crontab喜欢的路径的线索?@Peter这让我有点困惑。我没有libcurl.so,所以在我的路径中,但是您的系统可能会有不同的工作方式。您通常可以在crontab中修改环境变量。每行应该是环境设置或cron命令。如果您最后键入man crontab fixed,您应该会得到有关此的信息!问题不在路径本身,脚本加载路径时没有问题。问题是库目录需要位于LD_library_路径中。一旦用LIBRARY dir导出LD_LIBRARY_路径,脚本就可以正常工作。