쉘이 종료되거나 종료 될 때 백그라운드 작업이 종료되는지 여부는 정확히 무엇입니까?


12

이 질문에 도달했습니다 많은 ( 정말 많은 ),하지만 난 대답은 일반적으로 불완전한 찾는거야. 일반적인 질문은 "ssh를 종료 / 종료 할 때 왜 내 작업이 종료되지 않습니까?"이며 여기에 내가 찾은 내용이 있습니다. 첫 번째 질문은 다음과 같은 정보는 얼마나 일반적입니까? 다음은 현대 데비안 리눅스에서는 사실 인 것 같지만 약간의 정보가 빠져 있습니다. 그리고 다른 사람들이 알아야 할 것은 무엇입니까?

  1. ssh 연결이 닫히면 여부 SSH 연결을 통해 연 쉘의 백그라운드로 모든 자식 프로세스가 SIGHUP으로 사망하는 경우에만huponexit 실행 옵션이 설정되어 shopt huponexit이것이 사실인지 확인 할 수 있습니다.

  2. 경우 huponexit사실, 당신은 사용할 수 있습니다 nohup또는 disown당신이 종료 할 때이 살해되지 않도록 쉘에서 프로세스를 떼어 놓다. 또는를 사용하여 실행하십시오 screen.

  3. 요즘 최소한 일부 리눅스에서 기본값 인huponexit false 인 경우 정상적인 로그 아웃시 백그라운드 작업이 종료 되지 않습니다 .

  4. 그러나 경우에도 huponexit거짓, 다음 ssh 연결이됩니다 경우 사망 또는 (정상 로그 아웃과는 다른) 방울, 다음 백그라운드로 프로세스는 여전히 죽을 것입니다. 이것은 (2)에 의해 disown또는 nohup(2)에서 와 같이 피할 수 있습니다 .

  5. (a) 부모 프로세스가 터미널 인 프로세스와 (b) stdin, stdout 또는 stderr 이 터미널에 연결된 프로세스 사이에는 약간의 차이가 있습니다 . 나는 (a) 아닌 (b) 또는 그 반대의 프로세스에 어떤 일이 일어나는지 모른다.

마지막 질문 : 어떻게 행동을 피할 수 있습니까 (3)? 다시 말해, 데비안 백그라운드 프로세스는 기본적으로 로그 아웃 후 ssh 연결이 종료 된 후가 아니라 자체적으로 실행됩니다. 연결이 정상적으로 닫혔는지 또는 종료되었는지에 관계없이 프로세스에서 동일한 일이 발생하고 싶습니다. 아니면 이것이 나쁜 생각입니까?

편집 : 두 가지 경우 모두 작동하는 작업을 유지하는 또 다른 중요한 방법은 작동합니까 (?) screen을 통해 실행하는 것 입니다. 그러나 문제는 사물이 언제 죽이고 언제 죽지 않는지를 이해하는 것에 관한 것입니다. 때때로 사람들은 예를 들어 로그 아웃 할 때 일자리가 죽기를 원합니다.

이상의 스레드 - 신호 (SIGHUP), 작업에 대한 설명과 제어 터미널 - /server/117152/do-background-processes-get-a-sighup-when-logging-off이 - 계속 SSH 백그라운드 작업 / 작업 SSH를 닫을 때 - 윌 백그라운드에서 작업 넣어은 SSH 세션 후 실행 계속 닫혀? - 방지 SSH 클라이언트를 종료 후 중단되는 것을 이미 실행중인 백그라운드 프로세스 - 어떻게하면 내가 차단 한 후 계속 실행하도록 SSH를 통해 프로세스를 시작할 수 있습니다? - OS X에서 원격 작업을 계속 실행 할 수 없습니다 - 닫기 SSH 연결을

답변:


1

프로세스는 적어도 SIGHUP으로 죽지 않습니다. 적어도 엄격한 단어의 의미는 아닙니다. 오히려 연결이 끊어지면 터미널의 제어 프로세스 (이 경우 Bash)에 "HUP 신호"또는 SIGHUP이라고하는 행업 신호 *가 전송됩니다.

이제 프로세스가 신호를 받으면 원하는 방식으로 처리 할 수 ​​있습니다 **. 대부분의 신호 (HUP 포함)의 기본값은 즉시 종료하는 것입니다. 그러나 프로그램은 신호를 무시하거나 어떤 종류의 신호 처리기 기능을 실행할 수도 있습니다.

Bash는 마지막 옵션을 선택합니다. HUP 신호 처리기는 "huponexit"옵션이 true인지 확인하고, 그렇다면 해당 하위 프로세스로 SIGHUP을 보냅니다. 완료되면 Bash가 종료됩니다.

마찬가지로, 각 하위 프로세스는 신호를 수신 할 때 원하는 모든 작업을 자유롭게 수행 할 수 있습니다. 기본 설정 (즉, 즉시 죽음)으로 설정하거나 무시하거나 신호 처리기를 실행하십시오.

Nohup은 하위 프로세스의 기본 조치 만 "무시"로 변경합니다. 그러나 자식 프로세스가 실행되면 신호에 대한 자체 응답을 자유롭게 변경할 수 있습니다.

이것이 nohup으로 실행했지만 일부 프로그램이 죽는 이유입니다.

  1. Nohup은 기본 동작을 "무시"로 설정합니다.
  2. 프로그램은 종료시 일종의 정리를 수행해야하므로 SIGHUP 핸들러를 설치하여 우연히 "무시"플래그를 덮어 씁니다.
  3. SIGHUP이 도착하면 핸들러가 실행되어 프로그램의 데이터 파일 (또는 수행해야하는 모든 것)을 정리하고 프로그램을 종료합니다.
  4. 사용자는 처리기 또는 정리를 알거나 신경 쓰지 않으며 nohup에도 불구하고 프로그램이 종료되었음을 알 수 있습니다.

이곳은 "disown"이 들어온 곳입니다. Bash에 의해 제거 된 프로세스는 huponexit 옵션에 관계없이 HUP 신호를 보내지 않습니다. 따라서 프로그램이 자체 신호 처리기를 설정하더라도 신호는 실제로 전송되지 않으므로 처리기가 실행되지 않습니다. 그러나 프로그램이 로그 아웃 한 사용자에게 일부 텍스트를 표시하려고하면 I / O 오류가 발생하여 프로그램이 종료 될 수 있습니다.

그리고 네, 묻기 전에 "전화 끊기"용어는 UNIX의 전화 접속 메인 프레임 날짜에서 제외됩니다.

** 어쨌든 대부분의 신호. 예를 들어 SIGKILL은 항상 프로그램을 즉시 종료합니다.


2

포인트 1-4는 맞습니다. 포인트 5에 대해서는 아무것도 모릅니다. 최종 포인트는 훌륭한 응용 프로그램, 화면 을 통해 연결 종료 방법에 관계없이 모든 프로세스를 자연스럽게 끝낼 수 있습니다. 화면이 repos에 있습니다.

화면에 대한 사람 설명은 읽기 쉽지 않지만 무엇보다도 다음과 같습니다.

화면이 호출되면 쉘이 포함 된 단일 창 (또는 지정된 명령)을 작성한 다음 정상적으로 프로그램을 사용할 수 있도록 나옵니다. 그런 다음 언제든지 다른 프로그램 (더 많은 셸 포함)을 사용하여 새 (전체 화면) 창을 만들고, 기존 창을 종료하고, 창 목록을보고, 출력 로깅을 켜거나 끄고, 텍스트를 복사하여 붙여 넣을 수 있습니다 창간에, 스크롤 백 기록을보고, 원하는 방식으로 창간에 전환하는 등. 모든 창은 서로 완전히 독립적 인 프로그램을 실행합니다. 윈도우가 현재 보이지 않거나 전체 화면 세션이 사용자의 터미널에서 분리 된 경우에도 프로그램은 계속 실행됩니다.. 프로그램이 종료되면 screen (기본값)은 프로그램을 포함하는 창을 종료합니다. 이 창이 포 그라운드에 있으면 디스플레이가 이전 창으로 전환됩니다. 아무것도 남아 있지 않으면 화면이 종료됩니다.

가장 중요한 부분을 강조했습니다 .Ctrl + a + d 명령으로 창을 분리 한 다음 세션을 종료 / 로그 아웃 할 수 있으며 현재 분리 된 창은 계속 실행되며 내부의 프로그램은 계속 실행됩니다. 예를 들어 새 ssh 세션을 시작하여 다시 연결하면 screen -r 명령 은 표준 오류 / 출력에 대한 모든 출력을 명확하게 볼 수 있도록 이전에 분리 된 화면 세션을 다시 시작합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.