Linux

不能殺死陷阱上的孩子

  • June 13, 2020

我遇到了一些令我意想不到的事情:

我正在嘗試製作一個聊天腳本並設置在“ 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

尋找:

可以關閉所有子程序並呼叫函式而無需外殼斷開的東西

編輯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為 trap ctrl+ c,通過設置
trap 'chat_unloop' 2
  1. 我將陷阱移近他需要執行的功能女巫,所以我有:
chat_unloop(){
...
trap - 2
...
}
trap 'chat_unloop' 2
...

這以某種方式起作用……

也許是因為trap只擷取目前程序,但向子程序發送相同的信號

所以感謝所有試圖幫助我的人

引用自:https://unix.stackexchange.com/questions/592247