在linux中使用bash是否可以在前台生成并行进程?例如以下内容:
的 top.sh 的
#!/bin/bash
./myscript1.sh &
./myscript2.sh &
将并行生成两个进程作为后台线程。但是有可能将这些产生为前景线程吗?目的是在 top.sh 被杀时自动杀死 myscript1.sh 和 myscript2.sh 。感谢
答案 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