只有在前一个进程完成后才运行一个进程 |重击[重复]

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... 检查您的系统中是否存在flockwhich 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 读取它是避免这些问题的一种方法。

【讨论】:

以上是关于只有在前一个进程完成后才运行一个进程 |重击[重复]的主要内容,如果未能解决你的问题,请参考以下文章

主进程或者主线程是否会等待子线程或子进程的问题

Java学习笔记—多线程

读写锁 与 互斥锁

捕获信号时如何正确等待bash子进程完成

php-fpm的工作机制

Thread中的join使用