在前台产生并行进程

时间:2012-08-18 12:34:00

标签: linux bash parallel-processing foreground

在linux中使用bash是否可以在前台生成并行进程?例如以下内容:

top.sh

#!/bin/bash

./myscript1.sh &
./myscript2.sh &

将并行生成两个进程作为后台线程。但是有可能将这些产生为前景线程吗?目的是在 top.sh 被杀时自动杀死 myscript1.sh myscript2.sh 。感谢

2 个答案:

答案 0 :(得分:5)

前台只能有一份工作。您可以使脚本对任何到达它的信号做出反应,并将信号转发给其他作业。如果你想要一种杀死子进程的核心方法,你需要确保你的脚本可以使用:调用wait,这样你的脚本就不会退出,直到所有的工作都死了或脚本本身被杀死。< / p>

#!/bin/bash
jobs=
trap 'kill -HUP $jobs' INT TERM HUP
myscript1.sh & jobs="$jobs $!"
myscript2.sh & jobs="$jobs $!"
wait

你仍然可以通过向它发送一个它没有捕获的信号来杀死它,例如SIGQUIT(我故意遗漏)或SIGKILL(无法捕获)。

有一种方法可以让所有流程都在前台:通过管道连接它们。忽略SIGPIPE,以便进程的死亡不会杀死前一个进程。如果需要,可以通过其他文件描述符保存和恢复stdin和stdout。这样,脚本和后台任务将在同一个process group中,因此按 Ctrl + C 将同时终止包装器脚本和子进程。如果直接终止包装器脚本,那么不会影响子进程;您可以通过传递包装器脚本的PID的负数(例如kill -TERM -1234)来终止进程组。

trap '' PIPE
{
  myscript1.sh <&3 >&4 |
  myscript2.sh <&3 >&4
} 3<&0 4>&1

答案 1 :(得分:0)

使用GNU Parallel你的脚本将是:

#!/bin/bash

parallel ::: ./myscript1.sh ./myscript2.sh

甚至:

#!/usr/bin/parallel --shebang -r

./myscript1.sh
./myscript2.sh

观看介绍视频以了解详情:https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1