에 적어도 발생 GNU bash는 버전 4.3.42 x86_64의 && GNU bash는 버전 4.3.11 x86_64의
신호 ( SIGUSR1 )에 의해 인터럽트 가능을 얻는 sleep & wait $!
간단한 대신에 사용 합니다 . 그러나 bash 내장 기능은 다음을 실행할 때 이상한 방식으로 작동하는 것 같습니다.sleep
sleep
wait
터미널 1:
cat <(
trap 'echo SIGUSR1' SIGUSR1;
echo $BASHPID;
while :;do
sleep 1 &
wait $!;
echo test;
done
)&
터미널 2:
kill -10 /the pid of the subshell, printed by the previous command/
터미널 1:
^C (ctrl + C)
그런 다음 CPU를 100 % 레코딩하는 서브 쉘을 얻습니다.
터미널 1:
pkill -P $(pgrep -P $$)
이 동작이 발생하는 이유에 대해 알고 있습니까?
NB :가 cat <(/subshell/)
백그라운드에 없을 때 문제가 발생 하지 않습니다.
이 동작을 경험하는 다른 방법
터미널 1:
(
trap 'echo SIGUSR1' SIGUSR1;
echo $BASHPID;
while :;do
sleep 1 &
wait $!;
echo test;
done
)&
터미널 2:
kill -10 /the pid of the subshell, printed by the previous command/
터미널 1:
fg
^C (ctrl + C)
그런 다음 얼린 껍질을 얻으십시오.
이 행동을 경험하는 세 번째 방법
터미널 1:
(
trap 'echo SIGUSR1' SIGUSR1;
echo $BASHPID;
while :;do
sleep 1 &
wait $!;
echo test;
done
)
터미널 2:
kill -10 /the pid of the subshell, printed by the previous command/
터미널 1:
^C (ctrl + C)
그런 다음 얼린 껍질을 얻으십시오.
답변
관찰
ctrl+c
SIGINT
터미널 1의 fg 프로세스로 전송- 따라서, 실행
kill -2 <PID>
2 터미널에서 타격하는 것과 동일ctrl+c
터미널 1 - 터미널 2에서 실행 하기 전에 위의 두 지점 중 하나를 올바르게
kill -10 <PID>
처리SIGINT
합니다. - 하고있어 한 후 실행
kill -10 <PID>
터미널 2 (송신 신호SIGUSR1
처리하지 않습니다)SIGINT
문제가있는 행동을 올바르게 리드 - 교체
kill -2 <PID>
터미널 2 (SIGINT
)를kill -15 <PID>
(SIGTERM
) 또는kill -9 <PID>
(SIGKILL
)로 하면 항상 올바른 신호 처리로 이어집니다. kill -10 <PID>
터미널 2에서 실행 하면wait
내장 기능이 중단 되지만test
신호SIGUSR1
가 갇히고 루프가 계속 된 후 즉시 printet 이기 때문에 루프를 떠나지 않습니다 .- 배상
SIGINT
는 실행 루프를 중단wait
하고 쉘을 정지 시키거나 중단 / 정지 상태를 유지합니다.
결론
SIGINT
움 직이고 올바르게 처리되지 않았거나 수동 트래핑 후 무시 됨 SIGUSR1
또는 다른 사용자 정의 트래핑 됩니다. 그것은 프로세스가 여전히 존재한다는 것을 의미하며, 이것이 CPU를 먹거나 가열하거나 쉘을 동결시키는 이유입니다. 터미널 2에서 실행 kill -15 <PID>
하거나 kill -9 <PID>
터미널 2에서 프로세스를 종료 / 종료하고 터미널 1에 대한 제어권을 다시주고 CPU를 완화시킵니다.
이 문제가 발생하는 이유는 여전히 미스터리이지만, 누군가 커튼 뒤에서 실제로 무슨 일이 일어나고 있는지 정확하게 설명 할 수 있기를 바랍니다.