通过cron运行脚本时与手动执行时结果不同

时间:2020-09-07 20:10:33

标签: bash shell cron

我有一个脚本,该脚本使用keys.txt中的键对list.txt文件中的目的地列表进行一些curl调用,每个调用结果都保存在以服务器名+ _show_counters开头的另一个txt文件中。当我手动运行此脚本时,它会正确运行,并从list.txt中找到的正确服务器上给我正确的响应,但是当由cron运行时,提供的信息与正确的服务器并不相对应,而与后面列表中第4个位置的服务器相对应。

这是代码:

<div class="add">
    <i class="far fa-plus-square" type="submit"></i>
    <textarea class="input" placeholder="Add to To-Do list"></textarea>
</div>

这是cron内容:

#!/bin/bash
PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/opt/puppetlabs/bin
temp=/local/scripts/shell/checker/temp/
timestamp=$(date +'%Y_%m_%d--%H:%M:%S')

paste $temp"list.txt" $temp"keys.txt" > $temp"combined.txt"
awk '{ printf "https://%s//api/?type=op&cmd=blablabla&key=%s\n", $1, $2}' $temp"combined.txt" > $temp"allCurls.txt"

count=1
for crl in `more +1 ${temp}allCurls.txt`
do
        filename=`awk -v count=$count 'NR==count{print $1}'  ${temp}list.txt`
        filekey=${filename}
        filename="$temp${filename}_show_counters.txt"
        curl -k $crl > ${filename}
        echo curl -k   $crl  >> $temp"curls_debug.txt"
        count=$((count+1))
done

我已经尝试编辑cron以从以下命令开始,但是没有区别。

0,10,20,30,40,50 * * * * /local/scripts/shell/checker/checker.sh > /dev/null 2>&1

我在/ var / spool / mail /中发现以下错误,然后正确执行了所有连续的卷曲,这随后在提供的结果中导致了错误的顺序。

SHELL=/bin/bash
PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/opt/puppetlabs/bin 

所以我将echos curls_debug.txt添加到for中并找到:

curl: (6) Couldn't resolve host '::::::::::::::'
curl: (3) <url> malformed
curl: (6) Couldn't resolve host '::::::::::::::'

这仅在由cron执行时发生,如果我手动运行此脚本,则curls_debug.txt以预期的格式显示curl,该卷曲由curl -k https:// server_name + command + key组成,因为这是第一次卷曲,因此带来正确的结果。

任何人都可以帮我看看这里有什么问题以及如何解决吗?,非常感谢。

1 个答案:

答案 0 :(得分:2)

这是一个猜测,但是我怀疑是由于使用more来读取文件-more是一种交互式工具,不应在非交互式脚本中使用。使用cat会更好,但是通常使用while read ... done <file循环是最好的方法。而且,我不会使用凌乱的中间文件集,而只是使用一个组合的while read循环来并行读取两个文件(通过文件描述符#3和#4,只是为了保持环境整洁),然后放置这两个文件中的信息直接在一起:

#!/bin/bash
PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/opt/puppetlabs/bin
temp=/local/scripts/shell/checker/temp
timestamp=$(date +'%Y_%m_%d--%H:%M:%S')

while read domain <&3 && read key <&4; do
    crl="https://${domain}//api/?type=op&cmd=blablabla&key=${key}"
    filename="${temp}/${domain}_show_counters.txt"
    curl -k "$crl" > "${filename}"
done 3<"${temp}/list.txt" 4<"${temp}/keys.txt"

注意:我还清理了引号(通常,变量引用应该用双引号引起来),并将尾随/留在temp变量中(我发现它更清楚了在使用变量时添加它-明确说明我们是指该目录中的文件