SIGTERM으로 SIGSTOP'd 프로세스를 종료 할 수없는 이유는 무엇이며 보류중인 신호는 어디에 저장됩니까?


24

데비안 스트레치 (systemd)를 사용하고 있습니다. rsyslog 데몬을 포 그라운드에서 사용 /usr/sbin/rsyslogd -n 하고 있었고 Ctrl+ Z를 사용하여 중지했습니다. 프로세스 상태가 Tl(중지됨, 스레드 됨)으로 변경되었습니다 . 프로세스에 여러 명령을 실행했으며 프로세스 상태는 동일 합니다. 내가 한 후에 사망했다. 3 가지 질문이 있습니다.kill -15 <pid>Tlfg

  • SIGSTOP-ed 프로세스가 응답하지 않는 이유는 무엇 SIGTERM입니까? 커널이 왜 같은 상태를 유지합니까?
  • SIGCONT신호를 받는 순간 왜 죽었 습니까?
  • 이전 SIGTERM신호 때문인 경우 프로세스가 재개 될 때까지 어디에 유지 되었습니까?

답변:


41

SIGSTOP그리고 SIGKILL걸려 프로세스에 의해 처리 될 수없는 두 개의 신호이다. SIGTSTP처럼 SIGSTOP그것을 제외하고 를 발견하여 처리 할 수 있습니다.

SIGSTOPSIGTSTP신호 준비, 해당 트랙의 프로세스를 중지 SIGCONT. 해당 프로세스를 보낼 때 SIGTERM프로세스가 실행 중이 아니므로 종료 할 코드를 실행할 수 없습니다.

( SIGTTINSIGTTOU백그라운드 작업이 터미널에서 읽거나 쓰려고 할 때 TTY 계층에 의해 생성되는 신호 인 및가 있습니다. 이러한 프로세스는 잡힐 수는 있지만 프로세스를 중지 (정지) 할 수 있습니다 SIGTSTP. 이 답변의 나머지 부분 에서이 두 가지를 무시하십시오.)

귀하는 CtrlZ과정 A를 전송 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신호를 제외하고 계속 될 때까지 더 이상 신호를 전달할 수 없습니다 . 신호는 보류 중으로 표시되지만 프로세스가 계속 될 때까지 전달되지 않습니다. 신호는 항상 프로세스의 종료를 야기하고, 차단 처리되거나 무시 될 수 없다. 를 무시할 수 있지만 프로세스가 중지 된 경우 항상 프로세스가 계속됩니다. 프로세스에 신호를 보내면 해당 프로세스에 대한 보류중인 정지 신호가 삭제됩니다. 마찬가지로 프로세스에 대한 보류중인 신호는 중지 신호를 수신하면 삭제됩니다.SIGKILLSIGCONTSIGCONTSIGCONT


1
@nohup. 답변은 확장되었지만 본질적으로 "그렇습니다. kill -15이미 보낸 것을 처리했습니다 ".
roaima

2
문서에 따라 @nohup yes :« 프로세스가 중지 된 동안 계속 될 때까지 더 이상 신호를 전달할 수 없습니다. 신호가 보류 중으로 표시되었지만 프로세스가 계속 될 때까지 전달되지 않습니다. »
roaima

1
프로세스를 멈추는 SIGTTIN과 SIGTTOU
Stéphane Chazelas

1
@ StéphaneChazelas 좋은 지적. 나는 이것에 대한 언급을 추가했지만 그렇지 않으면 무시했다. 적합하다고 생각되면 자유롭게 편집하십시오.
roaima

2
@coteyr. 동의하지 않습니다. SIGKILL앱이 정리되는 것을 방지하므로 SIGTERM대부분의 경우 사용하는 것이 좋습니다.
roaima

9

SIGTERM프로세스에 의해 포착 될 수 있다는 에서 다른 신호 와 같습니다 . 신호를 수신하면 프로세스가 특수 신호 처리기 루틴으로 이동합니다. 의 경우 기본 동작이 프로세스를 종료 할 수 있지만 예 것이다 편집기는 죽어 전에 열려있는 파일의 초안 사본을 저장할 수 있도록 신호를 잡을 것 같아서. 프로세스가 중지되면 신호 핸들러를 실행할 수 없지만 신호는 프로세스가 계속 될 때까지 보류 상태로 남아 있습니다. 합니다 전송 신호는 일반적으로 저장되지 않습니다.SIGTERM

이론적으로 시스템은 프로세스에에 대한 신호 처리기가 설치되어 있는지 알 수 있고 SIGTERM그렇지 않은 경우 즉시 종료 할 수 있습니다. 그러나 (Gilles의 의견에 따라) POSIX는를 통해 프로세스가 계속 될 때까지 신호가 보류되도록 요구합니다 SIGCONT.


4
사과, 내 이전 의견이 잘못되었습니다. 프로세스가 중지되는 동안 SIGKILL 및 SIGCONT를 제외하고는 신호가 전달되지 않습니다. 신호에 프로세스를 강제 종료하는 기본 조치가 있더라도 SIGCONT에 의해 프로세스가 재개 될 때까지 지연됩니다. POSIX는이 동작을 의무화합니다.
Gilles 'SO- 악한 중지'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.