在linux中使用bash是否有可能在前台产生并行进程?例如以下内容:
top.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,以便进程的死亡不会杀死前一个进程.如果需要,可以通过其他文件描述符保存和恢复stdin和stdout.这样,脚本和后台任务将在同一个process group中,因此按下Ctrl C将同时终止包装器脚本和子进程.如果直接终止包装器脚本,那么不会影响子进程;你可以通过传递包装器脚本的PID的负数来杀死进程组(例如kill -TERM -1234).
trap '' PIPE
{
myscript1.sh <&3 >&4 |
myscript2.sh <&3 >&4
} 3<&0 4>&1