罠に閉じ込められた子どもたちは殺せない

罠に閉じ込められた子どもたちは殺せない

予期せぬ問題に密着しました。

チャットスクリプトを作成し、「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

わかりました..それで問題を解決しました。

  1. 設定でtrapトラップctrl+に変更しました。c
trap 'chat_unloop' 2
  1. 私はトラップを彼が実行しなければならない機能に近づけました。
chat_unloop(){
...
trap - 2
...
}
trap 'chat_unloop' 2
...

これはある程度動作します。
おそらくtrap現在のプロセスだけがキャプチャされますが、同じ信号がサブプロセスに送信されるためです。

私を助けようと努力してきたすべての人に感謝します

おすすめ記事