gpt4 book ai didi

bash - 通过 cron 运行脚本与手动执行的结果不同

转载 作者:行者123 更新时间:2023-12-04 08:56:43 24 4
gpt4 key购买 nike

我有一个脚本,它使用在 keys.txt 中找到的键对 list.txt 文件中找到的目标列表进行一些 curl 调用,每个调用结果都保存在以服务器名称 +_show_counters 开头的不同 txt 文件中。当我手动运行此脚本时,它会正确运行并从 list.txt 中找到的正确服务器给我正确的响应,但是当由 cron 运行时,提供的信息与正确的服务器不对应,而是与列表中后面 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')

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
我已经尝试编辑 cron 以从以下命令开始,但没有区别。
SHELL=/bin/bash
PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/opt/puppetlabs/bin
我在/var/spool/mail/下面发现错误,然后所有连续的卷发都正确执行,然后导致提供的结果顺序错误。
curl: (6) Couldn't resolve host '::::::::::::::'
curl: (3) <url> malformed
curl: (6) Couldn't resolve host '::::::::::::::'
所以我将 echo curls_debug.txt 添加到 for 并发现:
curl -k ::::::::::::::
curl -k /local/scripts/shell/checker/temp/allCurls.txt
curl -k ::::::::::::::
这仅在由 cron 执行时发生,如果我手动运行此脚本,则 curls_debug.txt 以预期的格式显示 curl -k https://server_name+command+key 自第一个 curl 组成的 curl,因此会带来正确的结果.
你们中的任何人都可以帮我看看这里出了什么问题以及如何解决它吗?非常感谢。

最佳答案

这是一个猜测,但我怀疑这是由于使用 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变量(我发现在使用变量时添加它会更清楚 - 清楚地表明我们指的是该目录中的文件)。

关于bash - 通过 cron 运行脚本与手动执行的结果不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63783659/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com