只有在前一个进程完成后才运行一个进程 |重击[重复]
Posted
技术标签:
【中文标题】只有在前一个进程完成后才运行一个进程 |重击[重复]【英文标题】:Run a process only when the previous one is finished | Bash [duplicate] 【发布时间】: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
【参考方案1】:
您可以尝试获取一个独占文件锁,并仅在其锁被释放时运行。你的代码可能像
#!/bin/bash
oldEnd=.zip
newEnd=_processed.dim
flock -e 200
while IFS= read -r -d'' i
do
if [ -f "$i%$oldEnd$newEnd" ];
then
echo "Already processed"
else
gpt /my/path/graph.xml -Pinput1="$i" -Poutput1="$i%$oldEnd$newEnd"
fi
done < <(find /my/path -maxdepth 1 -name "S1*.zip" -print0)
200> /tmp/aria.lock
此代码针对文件描述符 200(我们告诉 bash
打开以将输出重定向到锁定文件的那个)打开一个排他锁,并阻止其他脚本执行代码块,直到文件关闭。文件关闭一旦代码块完成,允许其他等待进程继续执行。
顺便说一句,您应该始终引用您的变量,并且应该避免解析 ls
输出。此外,为避免出现空格和意外通配问题,输出以零分隔的文件列表并使用read
读取它是避免这些问题的一种方法。
【讨论】:
以上是关于只有在前一个进程完成后才运行一个进程 |重击[重复]的主要内容,如果未能解决你的问题,请参考以下文章