적어도 다음 날짜에 발생합니다.GNU 배쉬 버전 4.3.42 x86_64&&GNU 배쉬 버전 4.3.11 x86_64
나는 신호로 인터럽트를 받기 위해 sleep & wait $!
간단한 대신에 사용합니다.sleep
sleep
SIGUSR1). 하지만 wait
다음을 실행하면 bash 내장 기능이 이상하게 동작하는 것 같습니다 .
터미널 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 $$)
이 동작이 발생하는 이유에 대해 알고 있습니까?
주의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)
그런 다음 냉동 껍질을 얻으십시오.
답변1
관찰
ctrl+c
SIGINT
터미널 1의 fg-process로 보냅니다 .- 따라서 터미널 2에서 실행하는 것은 터미널 1에서
kill -2 <PID>
실행하는 것과 동일합니다 .ctrl+c
- 위의 두 가지 중 하나를 수행~ 전에
kill -10 <PID>
터미널 2에서 실행하면SIGINT
올바르게 처리됩니다. - 그것을 하고 있다~ 후에터미널 2에서 실행
kill -10 <PID>
(신호 보내기SIGUSR1
)이 올바르게 처리되지 않아SIGINT
문제가 있는 동작이 발생합니다. kill -2 <PID>
터미널 2 (SIGINT
) 를kill -15 <PID>
(SIGTERM
) 또는kill -9 <PID>
( )로 바꾸면SIGKILL
항상 올바른 신호 처리가 이루어집니다.kill -10 <PID>
터미널 2에서 실행하면 내장이 중단되지만 신호가 트랩된 후 즉시 인쇄되고 루프가 계속되므로wait
루프를 떠나지 않습니다 .test
SIGUSR1
- 전송은
SIGINT
실행 루프에서 벗어나 쉘을 정지시키거나 중단되지 않고wait
대기/동결 상태를 유지합니다.
결론
SIGINT
SIGUSR1
기침 및 올바르게 처리되지 않거나 수동으로 트래핑 하거나 다른 사용자가 정의한 트래핑 후에 무시됩니다 . 이는 프로세스가 여전히 존재한다는 것을 의미하며 이것이 CPU를 먹거나 가열하거나 셸을 동결시키는 이유입니다. 터미널 2에서 kill -15 <PID>
또는를 실행하면 kill -9 <PID>
프로세스가 종료/종료되고 터미널 1에 대한 제어 권한이 다시 부여되고 CPU가 완화됩니다.
이 문제가 발생하는 이유는 여전히 미스터리로 남아 있지만 누군가가 커튼 뒤에서 실제로 무슨 일이 일어나고 있는지 정확히 설명할 수 있기를 바랍니다.