저는 Debian Stretch(systemd)를 사용하고 있습니다. 포그라운드에서 rsyslog 데몬을 실행
/usr/sbin/rsyslogd -n
하고 Ctrl+를 사용하여 Z중지합니다. 프로세스 상태가 Tl
(중지됨, 스레드됨)으로 변경됩니다. 프로세스에 여러 명령을 실행했는데 프로세스 상태가 동일합니다: . 한번 해보니 죽었습니다. 3가지 질문이 있습니다.kill -15 <pid>
Tl
fg
SIGSTOP
-ed 프로세스가 응답하지 않는 이유는 무엇입니까SIGTERM
? 커널은 왜 동일한 상태를 유지합니까?- 왜 신호를 받자마자
SIGCONT
죽었 을까? - 이전 신호 때문이라면
SIGTERM
프로세스가 재개되기 전에 어디에 저장되나요?
답변1
SIGSTOP
SIGKILL
프로세스가 포착하고 처리할 수 없는 두 가지 신호입니다 . 그거 빼고는 SIGTSTP
좋아SIGSTOP
할 수 있는잡아서 처리했습니다.
SIGSTOP
SIGTSTP
준비 중인 프로세스를 중지하라는 신호를 보냅니다 SIGCONT
. 프로세스에 을 보내면 SIGTERM
프로세스가 실행되고 있지 않으므로 코드를 실행하여 종료할 수 없습니다.
(또한 및 는 SIGTTIN
백그라운드 SIGTTOU
작업이 터미널에 읽거나 쓰려고 할 때 TTY 계층에서 생성되는 신호입니다. 잡을 수 있지만 그렇지 않으면 프로세스를 중지(중단)합니다 SIGTSTP
. 하지만 할 예정입니다. 이제 나머지 답변에서는 이 두 가지를 무시합니다.
어떤 방식으로든 특별히 처리되지 않는 것 같은 CtrlZ프로세스를 보내 므로 프로세스가 중단되거나 프로세스 가 중단됩니다 .SIGTSTP
rsyslogd
SIGCONT
SIGKILL
여기서 해결 방법은 프로세스가 신호를 수신하고 처리할 수 있도록 SIGCONT
사용자를 보내는 것 입니다.SIGTERM
예:
sleep 999 &
# Assume we got PID 456 for this process
kill -TSTP 456 # Suspend the process (nicely)
kill -TERM 456 # Terminate the process (nicely). Nothing happens
kill -CONT 456 # Continue the process so it can exit cleanly
선적 서류 비치GNU C 라이브러리나는 (내 강조가) 이것을 꽤 잘 설명한다고 생각합니다.
프로세스가 중지되면 프로세스가 계속 실행될 때까지 더 이상 신호를 전달할 수 없습니다.
SIGKILL
, 신호 및 (분명히) 신호를 제외하고SIGCONT
. 신호는 보류로 표시되지만 프로세스가 계속될 때까지 전달되지 않습니다.이SIGKILL
신호는 항상 프로세스를 종료하게 하며 차단, 처리 또는 무시할 수 없습니다.이를 무시할 수 있지만SIGCONT
프로세스가 중지된 경우 항상 프로세스가 계속 실행됩니다.SIGCONT
프로세스에 신호를 보내면 해당 프로세스에 대해 보류 중인 중지 신호가 모두 삭제됩니다. 마찬가지로,SIGCONT
프로세스가 중지 신호를 받으면 해당 프로세스에 대해 보류 중인 모든 신호가 삭제됩니다.
답변2
SIGTERM
남들과 똑같다신호내부에그것은 잡힐 수 있다과정을 통해. 신호를 수신하면 프로세스가 특수 신호 처리기 루틴으로 점프하게 됩니다. 기본 SIGTERM
작업은 프로세스를 종료하는 것이지만, 예를 들어 편집자는 종료되기 전에 열린 파일의 초안 복사본을 저장할 수 있도록 신호를 포착할 수 있습니다. 프로세스가 중지되면 신호 처리기를 실행할 수 없지만 프로세스가 계속될 때까지 신호는 보류 상태로 유지됩니다. 참고하시기 바랍니다,숫자전송된 신호는 일반적으로 저장되지 않습니다.
이론적으로 시스템은 프로세스에 신호 처리기가 설치되어 있는지 알 수 있고 SIGTERM
그렇지 않은 경우 즉시 종료합니다. 그러나 (Gilles의 의견에 따라) POSIX에서는 프로세스가 계속 진행될 때까지 신호가 보류될 것을 요구합니다 SIGCONT
.