linux - 如何运行本身启动两个后台进程的后台 shell 脚本?

标签 linux bash process background spawn

首先,我是编程的初学者,所以很抱歉我的问题中缺乏专业准确的术语,但希望我能设法表达我的观点!

您对如何在 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 个 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/

相关文章:

c - 使用 pid 启动 gdb

linux - 比较和交换后 CPU 缓存行会刷新吗?

C++ 和 CTime & 系统时钟更改

linux - shell 初始化 : error retrieving current directory: getcwd -- The usual fixes do not wor

linux - 模式匹配在 bash 脚本中不起作用

c++ - 使用其 PID 写入 STDIN 以进行处理

python - 代码更新时停止 uwsgi

linux - 在 CentOS 7 上构建 C 项目,链接器不能使用 -ldl 、 -lc

Git Bash 无法初始化

.NET 进程内存使用 = 5x CLR 堆内存?