无法杀死陷阱中的儿童

无法杀死陷阱中的儿童

我被一些意想不到的事情困住了:

我正在尝试制作一个聊天脚本并设置为在“ Ctrl+ Z”上调用函数

trap 'chat_unloop' 20

但在代码中我有一些行启动子后台子进程

while cat $P1 | sed -rn "s/^([a-zA-Z0-9]+)\:/\1[$(date +%H:%M:%S)]> /p" ; do : Nothing; done &

Ctrl+Z会导致:

^Z[1]+ Stopped   bash script.sh

进程断开终端连接,但整个进程处于打开状态(包含所有子子进程)

尝试了什么:

trap 'pkill -P $$; chat_unloop' 20 
trap 'kill -9 $(pgrep -P $$); chat_unloop' 20
trap 'chat_unloop' SIGTSTP
trap 'chat_unloop' TSTP

寻找:
可以关闭所有子进程并调用函数而无需 shell 断开连接的东西

编辑1: P1是带有 fifo 命名管道的文件

编辑2:

chat_unloop(){
    CHAT_LOCK=0
    trap - 20
    clear
    options=()
}
P1='/path/to/pipe.fifo'
[[ -p "$P1" ]] || mkfifo --mode=777 $P1
while cat $P1 | sed -rn "s/^([a-zA-Z0-9]+)\:/\1[$(date +%H:%M:%S)]> /p" ; do : Nothing; done &
trap 'chat_unloop' 20
while [[ $CHAT_LOCK -eq 1 ]] && read text
do
    echo "$text" >> $P1
done
clear

编辑3:

79394 script.sh #actual script process
  >79414 script.sh #pipe 2
  >79405 script.sh #pipe 1 (with $! I receive this)
     >82368 script.sh #while loop for pipe 1

答案1

好吧..所以我解决了这个问题:

  1. 我通过设置更改trap为 trap ctrl+c
trap 'chat_unloop' 2
  1. 我将陷阱移近了他需要执行的函数,所以我有:
chat_unloop(){
...
trap - 2
...
}
trap 'chat_unloop' 2
...

这在某种程度上起作用了......
也许是因为trap只捕获当前进程,但向子进程发送相同的信号

所以感谢所有试图帮助我的人

相关内容