예상치 못한 문제에 봉착했습니다.
채팅 스크립트를 만들고 " 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
현재 프로세스만 캡처되지만 동일한 신호가 하위 프로세스로 전송되기 때문일 수 있습니다.
나를 도와주려고 노력한 모든 분들께 감사드립니다