disown -h와 nohup은 효과적으로 동일하게 작동합니까?


18

disown

  • 쉘이 종료 될 때 쉘이 권한이없는 작업으로 SIGHUP을 보내지 않도록합니다.

  • 쉘의 작업 제어에서 사용하지 않는 작업을 제거합니다.

첫 번째는 두 번째의 결과입니까? 다시 말해, 쉘에서 시작된 프로세스가 쉘의 작업 제어에서 제거되면 쉘이 종료 될 때 쉘이 프로세스에 SIGHUP을 보내지 않습니까?

disown -h 여전히 쉘의 작업 제어하에 프로세스를 유지합니다. disown -h프로세스가 여전히 쉘에서 보낸 SIGHUP을 수신하지만 프로세스가 "무시"하도록 SIGHUP의 조치를 설정 한다는 의미 입니까? 비슷합니다 nohup.

$ sleep 123 & disown -h
[1] 26103
$ jobs
[1]+  Running                 sleep 123 &
$ fg 1
sleep 123
$ ^Z
[1]+  Stopped                 sleep 125
$ bg 1
[1]+ sleep 123 &
$ exit

$ ps aux | grep sleep
t        26103  0.0  0.0  14584   824 ?        S    15:19   0:00 sleep 123

수행 disown -hnohup우리가 터미널을 사용하여 자신의 차이를 무시하는 경우 효과적으로 같은 일?

감사.


여기서 논의되지 않은 또 다른 차이점은을 사용하지 않는 경우 nohupstdin / stdout / stderr을 TTY (원래 쉘이 하나에 연결되어 있어야 함)에서 직접 리디렉션해야한다는 것입니다. (OTOH, 실제로는 하드 코딩 된 기본값과 같은 것보다 더 나은 방법을 고려합니다 ./nohup.out).
Charles Duffy

답변:


21

nohup그리고 disown -h없는 정확히 같은 일.

disown, 프로세스는 현재의 대화 형 쉘에서 작업 목록에서 제거됩니다. 실행 jobs백그라운드 프로세스를 시작하고 실행 한 후 disown쉘에서 작업으로 해당 프로세스를 표시하지 않습니다. 사용하지 않는 작업은 HUP종료 될 때 쉘 에서을받지 않습니다 (그러나 끝 부분 참고).

을 사용 disown -h하면 작업 목록에서 작업이 제거되지 않지만 쉘은 HUP종료 된 경우 신호를 보내지 않습니다 (단, 참고 사항 참조).

nohup유틸리티는 무시 HUP신호를 주어진 유틸리티를 시작합니다. 이 유틸리티는 신호 마스크를 상속하므로 신호 nohup도 무시합니다 HUP. 쉘이 종료되면 프로세스는의 하위 프로세스로 유지됩니다 nohup(및 nohup상위로 바 re init).

차이점은 시작한 프로세스 가 신호를 보내는 사람에 관계없이 nohup무시 한다는 것 HUP입니다. 처리되지 않은 프로세스는 쉘에 의해 신호 보내지 는 않지만 여전히 예를 들어 신호를 보낼 수 있으며이를 무시하지 않습니다.HUPkill -s HUP <pid>

다음 HUP과 같은 경우에만 쉘 작업으로 전송됩니다.

  • 쉘이 로그인 쉘이고 huponexit쉘 옵션이 설정되어 있거나
  • 쉘 자체는 HUP신호를받습니다.

bash매뉴얼의 관련 비트 (내 강조) :

신호

[...]

쉘은 기본적 으로 a를 받으면SIGHUP 종료됩니다 . 종료하기 전에 대화식 쉘은 SIGHUP실행 또는 중지 된 모든 작업에 재전송합니다 . 중지 된 작업은 SIGCONT을 수신하기 위해 전송 됩니다 SIGHUP. 특정 작업에 신호를 보내는 쉘을 방지하기 위해, 상기와 작업 테이블에서 제거되어야 disown내장 (참조 SHELL BUILTIN COMMANDS아래) 또는 수신을 표시 SIGHUP 하여 disown -h.

는 IF huponexit쉘 옵션으로 설정되어 shopt, bash보내는 SIGHUP모든 작업 대화 형 로그인 쉘 종료에 있습니다.

disown [-ar] [-h] [jobspec ... | pid ... ]

옵션이 없으면 jobspec활성 작업 테이블에서 각각 을 제거하십시오 . [...] -h옵션이 제공되면 각각 jobspec이 테이블에서 제거되지 않지만 SIGHUP쉘이을 수신 할 경우 작업으로 전송되지SIGHUP 않도록 표시 됩니다. [...]

관련 :


내가 얻을 수 bash: disown: nohup: no such job와 동일한에 대한 sleep5에서 disown nohup sleep 5 &. 마지막 문장의 두 번째 명령은 무엇을 의미 했습니까?
Ruslan

예 @Ruslan 난을 누락 &거기에 (그리고의 순서 nohupdisown도 잘못). 감사. 지금 업데이트합니다.
Kusalananda


@Tim 답변을 과도하게 편집하여 죄송합니다. 내 머릿속을 잡는 데 시간이 걸렸습니다. 이제 끝났습니다.
Kusalananda

감사. disown쉘의 작업 목록에서 자식을 제거하여 쉘이 SIGHUP을 자식에게 보내지 않도록합니다. 어떻게 disown -h같은 것을 달성합니까?
Tim

4

그들은 다르다:

  • disown은 활성 작업 테이블에서 작업을 제거합니다. 그런 다음 현재 작업을 계속합니다. -h를 사용하면 프로세스에 SIGHUP 이 전송 되지 않습니다 . 대신 SIGHUP을받을 때 쉘을 포함하는 쉘로 죽게됩니다.

  • nohup은 HUP를 무시합니다. 그런 다음 프로세스를 닫으면 터미널로 전달 된 모든 것이 파일로 이동합니다 nohup.out.

    nohup은 POSIX에 의해 정의되지만 disown은 그렇지 않습니다.


"껍질이 들어간 껍질"과 무슨 뜻입니까? 부모 프로세스를 죽이는 것은 그 자체로 아이를 죽이지 않습니다. 터미널이 닫히는 프로그램은 일반적으로 터미널의 PTY에 연결된 파일 핸들과 상호 작용하려는 시도로 인해 실패하지만 stdin / stdout / stderr이 다른 곳으로 리디렉션되면 발생하지 않습니다.
Charles Duffy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.