【发布时间】:2019-08-13 07:49:05
【问题描述】:
我正在使用aria2 下载一些数据,并使用--on-download-complete 选项自动运行bash 脚本来处理数据。
aria2c --http-user='***' --http-passwd='***' --check-certificate=false --max-concurrent-downloads=2 -M products.meta4 --on-download-complete=/my/path/script_gpt.sh
专注于我的bash 脚本,
#!/bin/bash
oldEnd=.zip
newEnd=_processed.dim
for i in $(ls -d -1 /my/path/S1*.zip)
do
if [ -f ${i%$oldEnd}$newEnd ]; then
echo "Already processed"
else
gpt /my/path/graph.xml -Pinput1=$i -Poutput1=${i%$oldEnd}$newEnd
fi
done
基本上,每次下载完成时,都会启动一个for 循环。首先,它检查下载的产品是否已经被处理,如果没有,它会运行一个特定的任务。
我的问题是每次下载完成时,bash 脚本都会运行。这意味着如果从上次运行bash 脚本开始分析还没有完成,这两个任务将重叠并吃掉我所有的内存资源。
理想情况下,我想:
每次运行
bash脚本时,检查是否有仍在进行中的进程。如果是这样,等它完成后再运行
这就像创建一个任务队列(就像在 for 循环中,每次迭代都等到前一个迭代完成)。
我尝试使用wait 或标识PID 来实施解决方案,但没有成功。
也许改变方法,而不是使用aria2 来处理刚刚下载的数据,实施另一个解决方案?
【问题讨论】:
-
您可以在脚本开头尝试文件锁定,如果文件被锁定则等待或退出。
-
有什么实现的例子吗?不熟悉这种类型的实现
-
我认为类似的事情会起作用:
aria2c --http-user='***' --http-passwd='***' --check-certificate=false --max-concurrent-downloads=2 -M products.meta4 --on-download-complete="flock -x /tmp/aria.lock /my/path/script_gpt.sh" -
收到以下错误:
Could not execute user command: flock -x /tmp/aria.lock /my/path/script_gpt.sh: No such file or directory -
hummm... 检查您的系统中是否存在
flock:which flock
标签: bash shell directory filesystems aria2