백그라운드 프로세스를 시작한 다음 로그 아웃하면 계속 실행됩니까?


29

동료와의 오랜 토론 후에 이것을 묻는다면 여기에 설명이 필요합니다.

" &"를 명령 줄 에 추가하거나 " "를 사용하여 CTRL-Z백그라운드에서 다시 시작하여 백그라운드 프로세스를 시작합니다 bg. 그런 다음 로그 아웃합니다.

무슨 일이야?

우리는 그것이 SIGHUP에 의해 죽었을 것이라고 확신했지만, 이것은 일어나지 않았습니다. 다시 로그인하면 프로세스가 행복하게 실행되었고에 pstree의해 "채택되었다"고 표시되었습니다 init.

이것이 예상되는 동작입니까?

그러나 그렇다면 nohup명령의 목적은 무엇입니까? 어쨌든 프로세스가 있든 없든 프로세스가 종료되지 않는 것처럼 보입니다 ...


편집 1

더 자세한 내용은 :

  • 명령은 실제 ​​콘솔이 아닌 SSH 세션에서 시작되었습니다.
  • 명령은 및 / 또는 ; 없이 시작되었습니다 . 그런 다음으로 일시 중지되고 와 함께 백그라운드에서 다시 시작되었습니다 .nohup&CTRL-Zbg
  • ssh 세션 삭제 되지 않았습니다 . 실제 로그 아웃 ( " exit"명령)이있었습니다.
  • 프로세스는 scp파일 복사 작업이었습니다.
  • 다시 로그인 pstree하면 프로세스가 실행 중이고 하위 프로세스 인 것으로 표시되었습니다 init.

편집 2

질문을보다 명확하게 설명 하려면 명령을 사용하는 것처럼 프로세스를 백그라운드로 ( &또는 사용하여 bg) 무시 해도됩니다.SIGHUPnohup


편집 3

수동으로 a SIGHUP를 보내려고 scp했습니다. 종료되었으므로 신호를 무시하지 않습니다.

그런 다음 다시 시작하여 백그라운드에 놓고 로그 오프했습니다. "적용"되어 init계속 실행되어 다시 로그온 할 때 발견했습니다.

나는 지금 당황합니다. SIGHUP모든 로그 오프 로그가 전송 되지 않은 것 같습니다 .


거기에 콘솔 I / O에 대한 언급이 없었습니다. 1>/dev/null 2>&1배쉬 등으로 전환 했습니까 ?
에이버리 페인

아뇨. 물론 SCP는 표준 입력이 필요하지 않았고 표준 출력은 문제가되지 않은 것 같습니다.
Massimo

로그인 쉘로 쉘이 실행되는지 여부는 성능을 변경합니다. 여기에 해당 될 수 있습니다.
워너

다른 테스트를 수행하십시오. 여기에 요약했습니다 : serverfault.com/questions/117152 .
Massimo

답변:


20

답변을 찾았습니다.

BASH의 경우 이는 huponexit내장 옵션을 사용하여 보거나 설정할 수있는 쉘 옵션 에 따라 다릅니다 shopt.

이 옵션은 최소한 RedHat 기반 시스템에서 기본적으로 해제되어 있습니다.

BASH 매뉴얼 페이지 에 대한 추가 정보 :

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

huponexit 쉘 옵션이 shopt로 설정된 경우, bash는 대화식 로그인 쉘이 종료 될 때 모든 작업에 SIGHUP을 보냅니다.


2
그것은 바보 같은 기본값이지만 내 직감은 그것이 bash가 아니라 RH 결함이라고 말합니다. Btw, zsh를 사용하면 &를 사용할 수 있습니다! 제거 할 수있는 지름길로, & 포크로 처리 된 프로세스는 한숨을 쉬게합니다.
위르겐 스트로벨

7

Warner에 동의하고 내장 된 "disown"명령으로 쉘이 SIGHUP을 보내지 못하게 할 수 있다고 덧붙이고 싶습니다. bash 매뉴얼 페이지에 좋은 설명이 있습니다.


4

nohup 명령을 사용하여 명령 을 실행하고 출력을 nohup 출력 파일로 리디렉션 할 수 있습니다 . nohup 매뉴얼 페이지에서 :

nohup - run a command immune to hangups, with output to a non-tty

다른 옵션은 screen 명령 을 사용하는 것 입니다. 화면을 사용하면 나중에 프로세스에 다시 연결할 수 있다는 이점이 있습니다.


왜 다운 보트인가? nohup 및 screen을 사용하면 로그 아웃시 프로세스 종료를 피할 수 있습니다. 다른 것들도 있지만이 두 가지 일이 있습니다. 거래는 무엇입니까?
Jim

2
좋은 지적이라고 생각하지만 Q는 왜 프로세스가 죽지 않는지에 대한 이유입니다.
CarpeNoctem

2

프로세스를 백그라운드로 분기 할 때 프로세스를 실행하는 쉘의 하위 프로세스가됩니다.

쉘에서 실행중인 모든 하위 프로세스에는 종료시 SIGHUP이 전송됩니다. 정확한 상황에 따라 성능이 약간 다르며, 이는 bash 맨 페이지에 자세하게 설명되어 있습니다. 다른 쉘들도 비슷한 설명을 가지고있을 것입니다.

Apache 및 기타 데몬은 일반적으로 SIGHUP에서 구성을 다시로드합니다. 사용자 공간 유틸리티는 종종 죽습니다. 신호에 연결된 애플리케이션 성능은 애플리케이션마다 고유 할 수 있습니다.


이 과정에서 SIGHUP을 받았을 것입니다. 어쩌면 그것을 무시했을 것입니다. 확인하겠습니다.
Massimo

예, 정확히 그것이 내가 상황을 믿는 것입니다. 문서화 된 성능을 정말로 의심한다면 신호를 포착하고 기록하기 위해 작은 스크립트를 해킹 할 수 있습니다.
워너

0

그 과정은 무엇입니까? 이전 게시물에 설명 된 성능 1 이 정확했습니다.

특정 스크립트 기능 및 프로세스는 신호를 포착 할 수 있습니다. 루프는 미친 듯이 도망 갈 수 있습니다.

만나다:

SSH 세션 삭제-명령이 계속 실행됩니까?

오후 4시 22 분에 편집 1

bash 맨 페이지에서 :

The shell exits by default upon receipt of a SIGHUP.   Before  exiting,
an  interactive  shell  resends  the  SIGHUP  to  all  jobs, running or
topped.

초기 연구 1 은 OpenSSH가 SIGHUP, 아마도 더 많은 신호를 무시할 수 있음을 보여줍니다.


그 포스트는 실제로 질문을하게되어 기뻤습니다. 자세한 내용은 위의 편집을 참조하십시오.
Massimo

2
다른 스레드의 답변은 사용중인 SCP 명령을 읽고 SIGHUP에 반응하는 방법을 확인하는 것처럼
들립니다.

그리고 'nohup'은 SIGHUP으로 죽을 것이고 원하지 않는 명령을위한 것입니다.
mfinni

매뉴얼 페이지는 그것을 말하지 않습니다. 나는 그것을 죽이려고 노력할 것이다
Massimo

-1

과 같은 도구를 통해 명령을 실행하지 않은 경우 screen세션이 종료되면 해당 세션과 관련된 모든 작업 / 작업이 수행됩니다.


정확히 내가 생각한 것입니다. 그들은 단지 그렇게하지 않았습니다.
Massimo

그들은 당신이 묘사 한 것을 할 때마다 ... 어쩌면 그것은 당신이 사용하는 껍질에 달려 있습니까?
warren

-1 그들은 그렇지 않다. 대답은 그렇게 간단하지 않습니다. 방금 백그라운드에서 시작한 간단한 쉘 스크립트를 테스트했습니다. 루프되어 출력을 임시 파일로 보냈습니다. 터미널을 종료 한 후에도 계속 실행되었습니다 ( tail -f임시 파일에서 볼 수 있습니다. bash를 사용하는 CentOS 7.1 시스템에서
Mike S

@MikeS-보여주세요. 나는 당신이 묘사 한 행동을 목격 한 적이 없습니다
워렌

@warren -에 대한 내 대답을 참조하십시오 serverfault.com/questions/117152/...을 . 많은 사람들이 당신이 묘사 한 것과 다른 행동을 주장합니다. 실제로 Massimo는 자신의 프로세스가 계속 되었기 때문에 정확하게 게시했습니다.
Mike S
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.