함정에 갇힌 아이들은 죽일 수 없습니다

함정에 갇힌 아이들은 죽일 수 없습니다

예상치 못한 문제에 봉착했습니다.

채팅 스크립트를 만들고 " 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현재 프로세스만 캡처되지만 동일한 신호가 하위 프로세스로 전송되기 때문일 수 있습니다.

나를 도와주려고 노력한 모든 분들께 감사드립니다

관련 정보