在 linux 中使用 bash 是否可以在前台生成并行进程?例如以下:
顶部.sh
#!/bin/bash
./myscript1.sh &
./myscript2.sh &
将并行生成两个进程作为后台线程。但是,是否可以将这些作为前台线程生成?目的是在top.sh被杀死时自动杀死myscript1.sh和myscript2.sh。谢谢
在 linux 中使用 bash 是否可以在前台生成并行进程?例如以下:
顶部.sh
#!/bin/bash
./myscript1.sh &
./myscript2.sh &
将并行生成两个进程作为后台线程。但是,是否可以将这些作为前台线程生成?目的是在top.sh被杀死时自动杀死myscript1.sh和myscript2.sh。谢谢
你只能在前台做一份工作。您可以让脚本对到达它的任何信号做出反应,并将信号转发给其他作业。如果您想有一种杀死子进程的中央方式,您需要确保您的脚本一直存在:调用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
使用 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