로그아웃할 때 커널이 내 프로세스를 거부하는 이유는 무엇입니까?

로그아웃할 때 커널이 내 프로세스를 거부하는 이유는 무엇입니까?

SIGHUP(또는 유사한)을 사용하여 쉘 로그아웃이 발생할 때 disown으로 실행되는 프로세스의 동작을 이해하고 싶습니다.

이 프로세스는 간단히 다음을 수행합니다.

  1. 15초 동안 자세요
  2. "안녕하세요"를 인쇄하세요.
  3. /tmp에 빈 파일을 만듭니다.

자, 프로세스를 실행한 다음 ctrl-z, bg, 거부 및 로그아웃을 수행해 보겠습니다.

15초 후에는 /tmp의 빈 파일이 더 이상 존재하지 않습니다. 두 번째 명령(인쇄)을 제거하면 프로세스가 종료되고 빈 파일이 있으므로 프로세스가 셸이 연결되지 않은 상태에서 stdout으로 무언가를 보내면 커널로부터 신호를 받아 이를 종료합니다.

프로세스는 Perl, PHP 또는 C에 있어야 합니다(Bash 또는 Python에서는 발생하지 않는 것 같습니다).

백그라운드 실행을 위해 nohup을 사용하면 출력이 파일로 전송되고 이 문제에 직면하지 않을 것이라는 것을 알고 있습니다. 그러나 문제는 일부 출력이 있는 프로세스를 실행할 때 disown 명령의 동작을 이해하는 것입니다. (BTW, -h 거부를 사용하면 동일한 결과가 나타납니다).

답변1

귀하의 프로세스는 에 따라 다릅니다 SIGTTOU.

이런 일이 발생하지 않도록 하려면 더 이상 소유하지 않는 TTY에 무언가를 인쇄하지 않도록 주의해야 합니다.

관련 정보