적어도 그 일은 일어났습니다.GNU 배쉬 버전 4.3.42 x86_64&&GNU 배쉬 버전 4.3.11 x86_64
sleep & wait $!
단순히 sleep
신호를 통해 중단하는 대신sleep
SIGUSR1). 그런데 wait
다음 명령을 실행하면 bash-builtin이 이상하게 동작하는 것 같습니다.
터미널 1:
cat <(
trap 'echo SIGUSR1' SIGUSR1;
echo $BASHPID;
while :;do
sleep 1 &
wait $!;
echo test;
done
)&
NO2. 터미널:
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
)&
NO2. 터미널:
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
)
NO2. 터미널:
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
올바른 처리를 실시합니다. - 행위뒤쪽에
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이 발생하고 루프가 계속되므로 루프를 벗어나지 않습니다.- Send는
SIGINT
실행 루프를 중단하고 셸을 정지시키거나 결코 중단되지 않고wait
대기/정지 상태를 유지합니다.
결론적으로
SIGINT
SIGUSR1
수동 트래핑 이나 기타 사용자 정의 트래핑 후에는 올바르게 처리되지 않거나 무시됩니다 . 이는 프로세스가 여전히 존재한다는 것을 의미하며, 이는 CPU를 소비/가열하거나 셸을 동결시키는 이유입니다. 터미널 2에서 실행하면 프로세스가 종료/종료되며 터미널 1에 대한 제어권을 다시 얻고 CPU를 이완시킬 수 있습니다 kill -15 <PID>
.kill -9 <PID>
이 문제가 발생하는 이유는 여전히 미스터리이지만 누군가가 뒤에서 무슨 일이 일어나고 있는지 정확히 설명할 수 있기를 바랍니다.