首先,我是编程等的初学者,因此在我的问题中缺乏专业准确的术语而道歉,但希望我能设法得到我的观点!
您是否有任何建议如何在bash或tcsh中运行一个长的后台进程,该进程本身会启动一些程序,并且必须在不同的内核上并行运行三个长进程并等待所有三个进程完成后再继续... ?
我编写了一个shell脚本(用于bash),将一个图像过滤器应用于一个短而重的视频剪辑的每一帧(实际上这是科学的断层图像,但这并不重要)。它应该是:
使用脚本创建一个文件,使用em2em软件将整个文件转换为其他格式。
将转换后的文件分成三个相等的部分,并使用程序蜘蛛在我的linux服务器上的单独核心上以单独的进程过滤每组帧(以加快速度)。首先,创建三个具有所需过滤参数的批处理模式文件(filter_1 / 2 / 3.spi),然后启动三个子过程:
spider spi/spd @filter_1 & # The first process to be launched by the main script and run in the background on one core
spider spi/spd @filter_2 & # The second background process run on the next core
spider spi/spd @filter_3 # The third process to be run in parallel with the two above and be finished before proceeding further.
然后将这些过滤后的片段放在一起。
因为我想要同时运行3个过滤步骤,所以我将前两个步骤发送到背景中,只需简单的&并将最后一个保留在前台,这样主脚本进程将等待所有三个完成(应该同时发生),然后再继续重新组装3个块。当我在前台运行我的脚本时,这一切都正常,但它会将许多子进程的大量输出信息抛出到终端上。我可以通过以下方式减少它:
$ ./My_script 2>&1 > /dev/null
但是每个蜘蛛进程仍然会返回
*****Spider normal stop*****
到终端。当我尝试将主进程发送到后台时,它会一直停止。
您是否有任何建议如何在后台运行主脚本并仍以某种方式并行运行3个蜘蛛子进程?
谢谢!
答案 0 :(得分:2)
您可以在后台启动每个蜘蛛,存储您稍后可以在wait
命令中使用的进程ID,例如:
spider spi/spd @filter_1 &
sp1=$!
spider spi/spd @filter_2 &
sp2=$!
spider spi/spd @filter_3 &
sp3=$!
wait $sp1 $sp2 $sp3
如果您想摆脱输出,请在每个命令上应用重定向。
更新:实际上你甚至不需要存储PID,没有参数的wait
会自动等待所有衍生的孩子。
答案 1 :(得分:0)
首先,如果您使用bash,则可以使用wait
等待每个进程退出。例如,只有在所有进程完成后才会打印所有消息:
sleep 10 &
P1=$!
sleep 5 &
P2=$!
sleep 6 &
P3=$!
wait $P1
echo "P1 finished"
wait $P2
echo "P2 finished"
wait $P3
echo "P3 finished"
您可以使用相同的想法等待spider
进程完成,然后才合并结果。
关于输出,您可以尝试将每个输出重定向到/dev/null
,而不是重定向脚本的所有输出:
sleep 10 &> /dev/null &