쉘이 종료 될 때 백그라운드 작업이 종료되는지 또는 종료되는지 정확히 결정하는 것은 무엇입니까?

Petrelharp

이 질문에 도달했습니다 많은 ( 정말 많은 ),하지만 난 대답은 일반적으로 불완전한 찾는거야. 일반적인 질문은 "내가 ssh를 종료 / 종료 할 때 왜 내 직업이 죽지 않는가?"이며, 여기에 제가 찾은 내용이 있습니다. 첫 번째 질문은 다음 정보가 얼마나 일반적입니까? 다음은 최신 데비안 리눅스에 해당하는 것처럼 보이지만 약간의 누락이 있습니다. 다른 사람들은 무엇을 알아야합니까?

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

  2. huponexittrue 인 경우 nohup또는 disown사용 하여 셸에서 프로세스를 분리하여 종료 할 때 종료되지 않도록 할 수 있습니다. 또는 screen.

  3. 경우 huponexitfalse로, 기본입니다 일부는 요즘 linuxes 적어도 누른 후, 백그라운드로 작업을 할 수 없습니다 정상적인 로그 아웃에 살해.

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

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

마지막 질문 : 어떻게 행동을 피할 수 있습니까 (3)? 즉, 기본적으로 데비안의 백그라운드 프로세스는 로그 아웃 후 스스로 즐겁게 실행되지만 ssh 연결이 종료 된 후에는 실행되지 않습니다. 연결이 정상적으로 종료되었는지 또는 종료되었는지에 관계없이 프로세스에 동일한 일이 발생하기를 바랍니다. 아니면 이것은 나쁜 생각입니까?

편집 : (?) 죽는의 일자리를 유지하는 또 다른 중요한 방법으로, 어느 경우에 그 작품을 통해 실행하는 것입니다 화면 . 하지만 문제는 언제 죽고 죽지 않는지 이해하는 것에 관한 것입니다. 예를 들어, 때때로 사람들은 로그 아웃시 작업이 죽기를 원합니다.

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

숨겨진

프로세스는 "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은 항상 프로그램이 즉시 종료되도록합니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관