首先,我是编程的初学者,所以很抱歉我的问题中缺乏专业准确的术语,但希望我能设法表达我的观点!
您对如何在 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 个 block 之前。当我在前台运行我的脚本时,这一切都很好,但它会将许多子进程的大量输出信息抛到终端上。我可以通过以下方式减少它:
$ ./My_script 2>&1 > /dev/null
但是每个蜘蛛进程仍然返回
*****Spider normal stop*****
到终端。当我尝试将主进程发送到后台时,它一直在停止。
您对我如何在后台运行主脚本并仍然以某种方式并行运行 3 个蜘蛛子进程有什么建议吗?
谢谢!
最佳答案
您可以在后台启动每个爬虫,存储您稍后可以在 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
将自动等待所有生成的 child 。
关于linux - 如何运行本身启动两个后台进程的后台 shell 脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19225647/