`disown -h`와 `nohup`은 같은 방식으로 작동합니까?

`disown -h`와 `nohup`은 같은 방식으로 작동합니까?

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 -h터미널 사용 시 차이점을 무시하면 nohup똑같이 잘 작동합니까?

감사해요.

답변1

nohup그리고 disown -h는 아니다정확히같은 것.

disown현재 대화형 셸의 작업 목록에서 프로세스를 제거하는 데 사용됩니다 . jobs백그라운드 프로세스를 시작하고 실행 후 실행하면 disown해당 프로세스가 셸에서 작업으로 표시되지 않습니다. 거부된 작업은 종료 시 셸에서 를 수신하지 않습니다 HUP(그러나 끝에 있는 참고 사항 참조).

를 사용하면 disown -h작업이 작업 목록에서 제거되지 않지만 HUP쉘은 종료 시 신호를 보내지 않습니다(그러나 끝에 있는 참고 사항 참조).

유틸리티 는 신호를 nohup무시 HUP하고 지정된 유틸리티를 시작합니다. 이 유틸리티는 신호 마스크를 상속하므로 nohup신호 HUP도 무시됩니다. 쉘이 종료되면 프로세스는 하위 프로세스로 유지됩니다 nohup(그리고 nohup다시 상위 프로세스가 됩니다 init).

차이점은 누가 신호를 보내든 프로세스는 nohup이를 무시한다는 것입니다. HUP거부되는 프로세스는 다음과 같습니다.보내다신호HUP쉘을 통해, 그러나 예를 들어 에서 신호를 보내는 것은 여전히 ​​가능하며 kill -s HUP <pid>이는 무시되지 않습니다.

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

  • shell은 로그인 쉘이고 huponexit쉘 옵션이 설정되어 있습니다.
  • 쉘 자체가 HUP신호를 수신합니다.

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

신호

[...]

쉘은 기본적으로 종료됩니다하나를 받았다SIGHUP. 대화형 셸은 종료하기 전에 SIGHUP실행 중이거나 중지된 모든 작업을 다시 보냅니다 . 중지된 작업을 보내어 SIGCONT수신되었는지 확인합니다 SIGHUP. 쉘이 특정 작업에 신호를 보내는 것을 방지하려면 내장 함수 disown(아래 참조)를 사용하여 작업 테이블에서 해당 작업을 제거하거나 SHELL BUILTIN COMMANDS내장 함수를 사용하여 수신되지 않음으로 표시해야 합니다. .SIGHUPdisown -h

huponexit쉘 옵션이 로 설정되면 대화 shopt형 로그인 쉘이 종료될 때 모든 작업에 a가 전송됩니다 bash.SIGHUP

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

옵션이 없으면 jobspec활성 작업 목록에서 각 작업을 제거합니다. [...] -h옵션이 주어지면 각각 jobspec삭제되지 않음테이블에서 다음과 같이 표시되어 있습니다.SIGHUP쉘이SIGHUP. [...]

관련된:

답변2

그들은 다르다:

  • disown은 활성 작업 목록에서 해당 작업을 제거합니다. 그런 다음 현재 작업을 계속하세요. -h를 사용하는 절차는 다음과 같습니다.아니요SIGHUP을 보내세요. 대신 SIGHUP을 받으면 포함된 쉘과 함께 죽습니다.

  • nohup은 HUP를 무시합니다. 그런 다음 프로세스가 종료될 때 터미널로 전달되었을 모든 내용이 파일로 전송됩니다 nohup.out.

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

관련 정보