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 -hnohup우리가 터미널을 사용하여 자신의 차이를 무시하는 경우 효과적으로 같은 일?

감사.



답변

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 않도록 표시 됩니다. […]

관련 :


답변

그들은 다르다:

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

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

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


답변