로그 아웃 할 때 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.