我被一些意想不到的事情困住了:
我正在尝试制作一个聊天脚本并设置为在“ 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
好吧..所以我解决了这个问题:
- 我通过设置更改
trap
为 trapctrl
+c
trap 'chat_unloop' 2
- 我将陷阱移近了他需要执行的函数,所以我有:
chat_unloop(){
...
trap - 2
...
}
trap 'chat_unloop' 2
...
这在某种程度上起作用了......
也许是因为trap
只捕获当前进程,但向子进程发送相同的信号
所以感谢所有试图帮助我的人