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
내장 함수를 사용하여 수신되지 않음으로 표시해야 합니다. .SIGHUP
disown -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은 그렇지 않습니다.