予期せぬ問題に密着しました。
チャットスクリプトを作成し、「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
トラップctrl
+に変更しました。c
trap 'chat_unloop' 2
- 私はトラップを彼が実行しなければならない機能に近づけました。
chat_unloop(){
...
trap - 2
...
}
trap 'chat_unloop' 2
...
これはある程度動作します。
おそらくtrap
現在のプロセスだけがキャプチャされますが、同じ信号がサブプロセスに送信されるためです。
私を助けようと努力してきたすべての人に感謝します