로그 아웃 할 때 SIGHUP이 작업으로 전송되지 않는 경우는 무엇입니까?


10

달리기를 주장한 사용자의 답변을 읽었습니다.

foo 2>&1 >& output.log &

초래 foo가 로그 아웃 할 경우에도 계속 실행. 이 사용자에 따르면 SSH 연결에서도 작동했습니다.

SSH와의 연결을 끊거나 TTY를 종료하는 경우 쉘과 프로세스가 SIGHUP을 수신하여 종료 될 것이라는 인상을 받고 있다고 믿지 않았습니다. 이것은, 내 가정에서, 사용하는 유일한 이유였다 nohup이러한 경우에, 또는 tmux, screen등.

그런 다음 glibc의 매뉴얼 을 살펴 보았습니다 .

이 신호는 또한 터미널에서 제어 프로세스의 종료를 해당 세션과 연관된 작업에보고하는 데 사용됩니다. 이 종료는 세션의 모든 프로세스를 제어 터미널에서 효과적으로 연결 해제합니다.

이것은 내 생각을 확인하는 것 같습니다. 그러나 더 찾고, 그것을 말한다 :

프로세스가 제어 터미널이있는 세션 리더 인 경우 SIGHUP 신호는 포 그라운드 작업의 각 프로세스로 전송되며 제어 터미널은 해당 세션에서 연결 해제됩니다.

이것은 백그라운드에서 작업이 SIGHUP을받지 못한다 는 것을 의미 합니까?

내 더 혼란에, 나는 대화 형 zsh을 세션으로 실행을 실행 yes >& /dev/null &하고, 입력 exitzsh을 내가 작업을 실행했다고 나에게 경고 할 때, 그리고 입력 한 후 exit두 번째 시간, 그것은 SIGHUPed 하나 개의 작업을 한 것으로 나에게 말했다. Bash에서 정확히 똑같이하면 작업이 실행됩니다.


과거에 ssh를 통해 갑자기 연결이 끊어진 서버에 문제가 있었고 프로세스가 계속 실행되었지만 tty가 연결되지 않았으므로 다시 로그인하고 SIGHUP / TERM / KILL을 보내야했습니다. 따라서 동일한 논리에 따라 방금 테스트를 거쳐 유형이 지정 logout되었으며 yes여전히 실행 중입니다.
— Braiam

SIGHUP의 전송 여부에 관계없이 프로세스가 신호 처리기를 정의했는지 (SIGHUP를 잡는 지) 또는 신호 마스크가 해당 신호를 보낼 때 종료되는지 여부에 추가 요인이됩니다. 따라서 로그 아웃 후에도 계속 실행된다고해서 해당 신호가 전송되지 않았다는 의미는 아닙니다.
— Tim B

이 질문을 언급하고 있습니까 : serverfault.com/questions/115999/… ? 답은 거기에있는 것 같습니다-RedHat은 기본적으로 shopt를 설정하지 않습니다. RedHat의 특정 구성 문제입니다.
— Boris Burkov

@ 밥 아니, 나는 이것을 전에 본 적이 없지만 좋은 자료입니다. 감사!
— slhck

도움이되어 다행입니다. 실제로 라파엘도 그 문제를 언급하고 있습니다.
— Boris Burkov

답변:


18

Bash는 SIGHUP자체 수신 한 경우에만 전송하는 것 같습니다. SIGHUP예를 들어 가상 터미널이 닫히거나 SSH 연결이 중단 된 경우에 발생합니다. 로부터 문서 :

SIGHUP을 받으면 기본적으로 쉘이 종료됩니다. 종료하기 전에 대화식 쉘은 SIGHUP을 실행 또는 중지 된 모든 작업으로 다시 보냅니다. 중지 된 작업은 SIGHUP을 수신 할 수 있도록 SIGCONT로 전송됩니다. 쉘이 SIGHUP 신호를 특정 작업으로 전송하지 못하게하려면 disown 내장 (작업 제어 내장 참조)이있는 작업 테이블에서 제거하거나 disown -h를 사용하여 SIGHUP을 수신하지 않도록 표시해야합니다.

따라서 입력 exit하거나 Ctrl+를 누르면 D모든 백그라운드 프로세스가 유지됩니다. 이는 Bash에 끊기 신호를 보내지 않기 때문입니다.

Bash가 백그라운드 프로세스가 여전히 실행되고 있다는 사실에 대해 경고하도록 할 수 있습니다.

shopt -s checkjobs

SIGHUP대화식 쉘에있는 경우 종료시 전송 옵션이 있습니다 ( 여기 참조 ). 그러나 Bash 4.2.25가있는 내 컴퓨터에서는 작동하지 않습니다. 어쩌면 그것은 당신을 위해 작동

shopt -s huponexit

따라서 SSH 연결이 중단되면 SIGHUP깨끗하게 종료 된 상태에서 작업이 계속 실행됩니까? 그것은 내가 본 것을 설명합니다.
— slhck

예. 끊기 신호는 사용자와의 연결이 중단 된 특수한 경우에만 존재합니다.
— Raphael Ahrens



@npostavs는 답변에 추가 한 정보에 감사드립니다.
— Raphael Ahrens
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.