4

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

顶部.sh

#!/bin/bash

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

将并行生成两个进程作为后台线程。但是,是否可以将这些作为前台线程生成?目的是在top.sh被杀死时自动杀死myscript1.shmyscript2.sh。谢谢

4

2 回答 2

7

你只能在前台做一份工作。您可以让脚本对到达它的任何信号做出反应,并将信号转发给其他作业。如果您想有一种杀死子进程的中央方式,您需要确保您的脚本一直存在:调用wait以便您的脚本在所有作业都已终止或脚本本身被终止之前不会退出。

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

您仍然可以通过向它发送一个它没有捕获的信号来仅终止包装脚本,例如 SIGQUIT (我故意遗漏了)或 SIGKILL (无法捕获)。

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

trap '' PIPE
{
  myscript1.sh <&3 >&4 |
  myscript2.sh <&3 >&4
} 3<&0 4>&1
于 2012-08-18T12:51:21.263 回答
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

于 2012-08-20T08:52:58.317 回答