gpt4 book ai didi

linux - 在 bash 脚本中跟踪执行时间并在执行时间过长时终止当前命令

转载 作者:太空宇宙 更新时间:2023-11-04 12:41:24 24 4
gpt4 key购买 nike

我正在尝试创建一个 bash 脚本来从某个网站大量下载文件。

他们的下载链接是连续的——例如它只是 id=1, id=2, id=3 一直到 660000。唯一的要求是你必须登录,这使得这有点困难。哦,登录会在几个小时后随机超时,所以我必须重新登录。

这是我当前的脚本,大约 99% 的时间都运行良好。

#!/bin/sh
cd downloads

for i in `seq 1 660000`
do
lastname=""
echo "Downloading file $i"
echo "Downloading file $i" >> _downloadinglog.txt

response=$(curl --write-out %{http_code} -b _cookies.txt -c _cookies.txt --silent --output /dev/null "[sample URL to make sure cookie is still logged in]")

if ! [ $response -eq 200 ]

then
echo "Cookie didn't work, trying to re-log in..."
curl -d "userid=[USERNAME]" -d "pwd=[PASSWORD]" -b _cookies.txt -c _cookies.txt --silent --output /dev/null "[login URL]"
response=$(curl --write-out %{http_code} -b _cookies.txt -c _cookies.txt --silent --output /dev/null "[sample URL again]")
if ! [ $response -eq 200 ]
then
echo "Something weird happened?? Response code $response. Logging in didn't fix issue, fix then resume from $(($i - 1))"
echo "Something weird happened?? Response code $response. Logging in didn't fix issue, fix then resume from $(($i - 1))" >> _downloadinglog.txt
exit 0
fi
echo "Downloading file $(($i - 1)) again incase cookie expiring caused it to fail"
echo "Downloading file $(($i - 1)) again incase cookie expiring caused it to fail" >> _downloadinglog.txt
lastname=$(curl --write-out %{filename_effective} -O -J -b _cookies.txt -c _cookies.txt "[URL to download files]?id=$(($i - 1))")
echo "id $(($i - 1)) = $lastname" >> _downloadinglog.txt
lastname=""
echo "Downloading file $i"
echo "Downloading file $i" >> _downloadinglog.txt
fi
lastname=$(curl --write-out %{filename_effective} -O -J -b _cookies.txt -c _cookies.txt "[URL to download files]?id=$i")
echo "id $i = $lastname" >> _downloadinglog.txt
done

所以基本上我所做的就是在移动到集合中的下一个文件之前尝试下载一个随机文件。如果下载失败,我们假设登录 cookie 不再有效,并告诉 curl 让我重新登录。

效果很好,我可以从中获取数千个文件。但会发生的情况是——要么我的路由器出现故障一两秒钟,或者他们的网站出现故障一两分钟,curl 会坐在那里以为它正在下载几个小时。我曾经在同一个文件上花费 24 小时回到它。它似乎无法知道传输是否在中间超时 - 只有当它无法开始传输时才知道。

我知道如果将命令与“ sleep ”结合使用,有多种方法可以终止命令的执行,但由于这必须“智能”并从停止的地方重新开始,所以我不能只终止整个脚本。

有什么建议吗?如果我可以使用它通过终端命令登录,我愿意使用 curl 以外的东西。

最佳答案

您可以尝试使用 curl 选项 --connect-timeout--max-time--max-time 应该是你的选择。

来自手册:

--max-time

Maximum time in seconds that you allow the whole operation to take. This is useful for preventing your batch jobs from hanging for hours due to slow networks or links going down. Since 7.32.0, this option accepts decimal values, but the actual timeout will decrease in accuracy as the specified timeout increases in decimal precision. See also the --connect-timeout option.

If this option is used several times, the last one will be used.

然后将命令的结果捕获到 var 中,并根据结果进一步处理。

关于linux - 在 bash 脚本中跟踪执行时间并在执行时间过长时终止当前命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40097858/

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