【问题标题】:How to run a background shell script which itself lauches two background processes?如何运行本身启动两个后台进程的后台shell脚本?
【发布时间】:2013-10-14 01:46:48
【问题描述】:

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

您对如何在 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 个蜘蛛子进程有什么建议吗?

谢谢!

【问题讨论】:

  • 而不是 ./My_script 2>&1 > /dev/null,它将 stdout 定向到 /dev/null 并将 stderr 定向到原始 stdout(您在其中键入命令的 tty),尝试使用 @987654325 将两者都重定向到 /dev/null @。订单很重要。

标签: linux bash process background spawn


【解决方案1】:

首先,如果您使用 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 &

【讨论】:

    【解决方案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 将自动等待所有生成的孩子。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-16
      • 1970-01-01
      • 2021-08-11
      • 1970-01-01
      • 2011-08-27
      相关资源
      最近更新 更多