1

首先,我是编程等方面的初学者,因此为我的问题中缺乏专业准确的术语而道歉,但希望我能设法表达我的观点!

您对如何在 bash 或 tcsh 中运行一个长的后台进程有什么建议吗?该进程本身会启动一些程序,并且必须在不同的内核上并行运行三个长进程并等待所有三个进程都完成,然后再继续...?

我编写了一个 shell 脚本(用于 bash),将图像过滤器应用于一个短而重的视频剪辑的每一帧(实际上它是一个科学断层图,但这并不重要)。它应该:

  1. 使用 em2em 软件创建带有脚本的文件,以将整个文件转换为不同的格式。

  2. 将转换后的文件分成三个相等的部分,并使用程序蜘蛛在我的 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 个蜘蛛子进程有什么建议吗?

谢谢!

4

2 回答 2

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没有参数的 a 会自动等待所有生成的孩子。

于 2013-10-07T13:39:21.083 回答
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 &
于 2013-10-07T13:41:02.733 回答