Linux
不能殺死陷阱上的孩子
我遇到了一些令我意想不到的事情:
我正在嘗試製作一個聊天腳本並設置在“
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
好的..所以我解決了這個問題:
- 我更改
trap
為 trapctrl
+c
,通過設置trap 'chat_unloop' 2
- 我將陷阱移近他需要執行的功能女巫,所以我有:
chat_unloop(){ ... trap - 2 ... } trap 'chat_unloop' 2 ...
這以某種方式起作用……
也許是因為
trap
只擷取目前程序,但向子程序發送相同的信號所以感謝所有試圖幫助我的人