를 통해 로그인한 후 ssh
다음 명령을 입력합니다 bash
.
sleep 50000000000000 &
그런 다음 kill -9
프로세스 sleep
의 상위 프로세스(예: bash
)입니다. 그런 다음 터미널 창의 연결이 동시에 끊어집니다.
다시 로그인하면 프로세스 sleep
가 아직 살아 있는 것을 알 수 있습니다.
질문: sleep
로그아웃하고 터미널을 닫아도 프로세스가 계속 유지되는 이유는 무엇입니까? 내 생각에는 nohup
로그아웃하는 동안 데몬과 프로그램을 제외한 모든 것이 종료될 것입니다. 이런 식으로 살아남을 수 있다면 sleep
명령 대신 이 방법을 사용할 수 있다는 뜻인가요 nohup
?
답변1
요약:
sleep
로그아웃하고 터미널을 닫아도 프로세스가 계속 유지되는 이유는 무엇입니까 ? 내 생각에는nohup
로그아웃하는 동안 데몬과 프로그램을 제외한 모든 것이 종료될 것입니다. 이런 식으로 살아남을 수 있다면sleep
명령 대신 이 방법을 사용할 수 있다는 뜻인가요nohup
?
bash
생성된 인스턴스에 ssh
옵션 이 설정되어 있지 않으면 huponexit
종료/로그아웃 시 어떤 프로세스도 종료되지 않으며 huponexit
옵션이 설정된 경우 셸에서 사용하는 것은 셸의 하위 프로세스에서 kill -9
사용하는 것보다 좋은 대안이 아닙니다 . 셸의 하위 프로세스에서는 셸에서 오지 않는 SIGHUP으로부터 프로세스를 보호하며, 중요하지 않은 경우에도 셸을 정상적으로 종료할 수 있으므로 여전히 선호됩니다.nohup
nohup
nohup
여기 에는 bash
이라는 옵션이 있습니다 huponexit
. 이 옵션을 설정하면 bash
종료/로그아웃 시 SIGHUP이 하위 항목으로 설정됩니다.
인터랙티브하게비로그인 bash
인스턴스(예: bash
에서 생성된 인스턴스) 에서는 gnome-terminal
이 옵션이 무시됩니다. huponexit
설정 여부에 관계없이 종료 시 bash
의 자식은 절대 SIGHUP되지 않습니다 bash
.
인터랙티브하게로그인 bash
bash
에 의해 생성된 인스턴스 와 같은 인스턴스에서는 ssh
이 옵션이 무시되지 않습니다(그러나 기본적으로 설정되지 않음). huponexit
설정 되면 종료/로그아웃 시 bash
의 하위 항목이 SIGHUP됩니다 . 설정되지 않은 bash
경우 종료/로그아웃 시 의 하위 항목이 SIGHUP되지 않습니다 .huponexit
bash
bash
bash
따라서 일반적으로 대화형 로그인 인스턴스 에서 종료/로그아웃하면 huponexit
옵션이 설정되지 않는 한 셸이 SIGHUP 자식으로 만들지 않으며, 대화형 비로그인 인스턴스에서 종료/로그아웃해도 bash
셸이 SIGHUP 자식으로 만들지 않습니다. 에 관계없이;
그러나 이 경우에는 관련이 없습니다. kill -9
sleep
상위 프로세스( bash
)를 종료해도 후자가 수행할 기회가 남지 않기 때문에 사용은 관계없이 유지됩니다.아무것전자로 변경합니다(예: 현재 bash
인스턴스가 로그인 bash
인스턴스이고 huponexit
옵션이 SIGHUP으로 설정된 경우).
게다가 다른 신호(예: 로 전송되는 SIGHUP 신호 bash
)와는 달리 SIGKILL 신호는 프로세스의 하위 프로세스에 전파되지 않으므로 sleep
종료되지도 않습니다.
nohup
SIGHUP 신호에 면역인 프로세스를 시작합니다. 이는 뭔가 다릅니다. SIGHUP 신호 수신 시 프로세스가 중단되는 것을 방지합니다. 이 경우 옵션이 설정되고 쉘이 종료된 bash
경우 대화형 로그인 인스턴스 에서 수신할 수 있습니다. huponexit
따라서 기술적으로 unset 옵션을 사용하여 대화형 로그인 인스턴스 nohup
에서 프로세스를 시작하는 데 사용 하면 프로세스가 SIGHUP 신호 수신 시 중단되는 것을 방지할 수 있지만 쉘에서 종료/로그아웃해도 상관없이 SIGHUP되지 않습니다.bash
huponexit
그러나 일반적으로 상위 쉘에서 오는 SIGHUP 신호를 방지해야 하는 경우 하위 메소드보다 상위 메소드를 nohup
선호할 이유가 없습니다 . 대신에 그 반대가 되어야 합니다.kill -9
nohup
메서드를 사용하여 부모를 종료해도 kill -9
부모가 정상적으로 종료될 기회가 남지 않는 반면, nohup
메서드를 사용하여 자식을 시작하면 부모가 SIGHUP과 같은 다른 신호에 의해 종료될 수 있습니다(문맥에서 의미가 있는 예를 만들기 위해). 하위가 nohup
)를 사용하기 시작하여 정상적으로 종료될 수 있습니다.
답변2
bash
기본적으로종료 시 HUP 신호를 하위 프로세스로 보내지 않습니다.. 더 자세히(@kos에게 감사드립니다), 절대로 그렇게 하지 않습니다.비로그인 쉘.
이를 수행하도록 bash를 구성할 수 있습니다.로그인 쉘옵션을 설정한 경우 huponexit
. 터미널에서 다음을 수행하십시오.
[romano:~] % bash -l
(이것은 새로운 "로그인" 쉘을 시작합니다)
romano@pern:~$ shopt -s huponexit
romano@pern:~$ sleep 1234 &
[1] 32202
romano@pern:~$ exit
logout
이제 sleep
프로세스를 확인하십시오.
[romano:~] % ps augx | grep sleep
romano 32231 0.0 0.0 16000 2408 pts/11 S+ 15:23 0:00 grep sleep
...실행 중이 아님: HUP 신호를 수신하고 요청한 대로 종료되었습니다.
답변3
이렇게 해서 살아남을 수 있다면 , 명령
sleep
대신 이 방법을 사용할 수 있다는 뜻이라면 ?nohup
kill -9
정말 가야 할 길이 아니다. TV를 끄려고 총을 쏘는 것과 같습니다. 코믹한 요소 외에는 장점이 없습니다. 프로세스는 를 포착하거나 무시할 수 없습니다 SIGKILL
. 프로세스가 수행 중인 작업을 완료하고 정리할 기회를 주지 않으면 손상된 파일(또는 다른 상태)이 남아 다시 시작할 수 없게 됩니다. kill -9
아무것도 효과가 없을 때 마지막 희망입니다.
로그아웃하고 터미널을 닫아도 수면 프로세스가 유지되는 이유 내 생각에는 로그아웃하면 데몬과 nohup 프로그램을 제외한 모든 프로그램이 종료됩니다.
귀하의 경우에는 어떤 일이 발생합니까?
의 상위 프로세스는 sleep
현재 실행 중인 bash
셸입니다. bash를 실행 하면 kill -9
bash 프로세스는 SIGHUP
자식 프로세스에 a를 보낼 기회가 없습니다. 왜냐하면 SIGKILL
(에서 전송한 kill -9
)을 프로세스에서 포착할 수 없기 때문입니다. 절전 프로세스가 계속 실행됩니다. 잠은 이제고아 프로세스.
init(PID 1) 프로세스는 부모 재지정이라는 메커니즘을 수행합니다. 이는 init 프로세스가 이제 고아 프로세스의 상위 프로세스가 됨을 의미합니다. init는 예외입니다. 원래 상위 프로세스를 잃은 프로세스를 수집하므로 프로세스가 하위 프로세스가 될 수 있습니다. Btw: (같은) 데몬은 sshd
"백그라운드로 들어갈 때" 그런 일을 합니다.
그런 일이 발생하지 않으면 고아 프로세스는 나중에(완료되면) 좀비 프로세스가 됩니다. 이는 waitpid()
호출되지 않을 때 발생하는 일입니다(해당 프로세스가 종료되면 완료될 수 없는 상위 프로세스의 책임). init는 waitpid()
좀비 자식을 피하기 위해 특정 간격으로 호출합니다.
답변4
사용하면 &
프로그램이 백그라운드로 실행됩니다. 백그라운드에서 프로그램을 보려면 bg
command 를 사용하고 다시 포그라운드로 실행되도록 하려면 를 실행하십시오 fg
.
예, 기본 터미널이 종료된 경우에도 프로그램을 계속 실행하는 방법에는 여러 가지가 있습니다.