로그아웃한 후에도 프로세스가 계속 실행되는 이유는 무엇입니까?

로그아웃한 후에도 프로세스가 계속 실행되는 이유는 무엇입니까?

를 통해 로그인한 후 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으로부터 프로세스를 보호하며, 중요하지 않은 경우에도 셸을 정상적으로 종료할 수 있으므로 여전히 선호됩니다.nohupnohupnohup


여기 에는 bash이라는 옵션이 있습니다 huponexit. 이 옵션을 설정하면 bash종료/로그아웃 시 SIGHUP이 하위 항목으로 설정됩니다.

인터랙티브하게비로그인 bash인스턴스(예: bash에서 생성된 인스턴스) 에서는 gnome-terminal이 옵션이 무시됩니다. huponexit설정 여부에 관계없이 종료 시 bash의 자식은 절대 SIGHUP되지 않습니다 bash.

인터랙티브하게로그인 bashbash에 의해 생성된 인스턴스 와 같은 인스턴스에서는 ssh이 옵션이 무시되지 않습니다(그러나 기본적으로 설정되지 않음). huponexit설정 되면 종료/로그아웃 시 bash의 하위 항목이 SIGHUP됩니다 . 설정되지 않은 bash경우 종료/로그아웃 시 의 하위 항목이 SIGHUP되지 않습니다 .huponexitbashbash

bash따라서 일반적으로 대화형 로그인 인스턴스 에서 종료/로그아웃하면 huponexit옵션이 설정되지 않는 한 셸이 SIGHUP 자식으로 만들지 않으며, 대화형 비로그인 인스턴스에서 종료/로그아웃해도 bash셸이 SIGHUP 자식으로 만들지 않습니다. 에 관계없이;

그러나 이 경우에는 관련이 없습니다. kill -9 sleep상위 프로세스( bash)를 종료해도 후자가 수행할 기회가 남지 않기 때문에 사용은 관계없이 유지됩니다.아무것전자로 변경합니다(예: 현재 bash인스턴스가 로그인 bash인스턴스이고 huponexit옵션이 SIGHUP으로 설정된 경우).

게다가 다른 신호(예: 로 전송되는 SIGHUP 신호 bash)와는 달리 SIGKILL 신호는 프로세스의 하위 프로세스에 전파되지 않으므로 sleep종료되지도 않습니다.

nohupSIGHUP 신호에 면역인 프로세스를 시작합니다. 이는 뭔가 다릅니다. SIGHUP 신호 수신 시 프로세스가 중단되는 것을 방지합니다. 이 경우 옵션이 설정되고 쉘이 종료된 bash경우 대화형 로그인 인스턴스 에서 수신할 수 있습니다. huponexit따라서 기술적으로 unset 옵션을 사용하여 대화형 로그인 인스턴스 nohup에서 프로세스를 시작하는 데 사용 하면 프로세스가 SIGHUP 신호 수신 시 중단되는 것을 방지할 수 있지만 쉘에서 종료/로그아웃해도 상관없이 SIGHUP되지 않습니다.bashhuponexit

그러나 일반적으로 상위 쉘에서 오는 SIGHUP 신호를 방지해야 하는 경우 하위 메소드보다 상위 메소드를 nohup선호할 이유가 없습니다 . 대신에 그 반대가 되어야 합니다.kill -9nohup

메서드를 사용하여 부모를 종료해도 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 -9bash 프로세스는 SIGHUP자식 프로세스에 a를 보낼 기회가 없습니다. 왜냐하면 SIGKILL(에서 전송한 kill -9)을 프로세스에서 포착할 수 없기 때문입니다. 절전 프로세스가 계속 실행됩니다. 잠은 이제고아 프로세스.

init(PID 1) 프로세스는 부모 재지정이라는 메커니즘을 수행합니다. 이는 init 프로세스가 이제 고아 프로세스의 상위 프로세스가 됨을 의미합니다. init는 예외입니다. 원래 상위 프로세스를 잃은 프로세스를 수집하므로 프로세스가 하위 프로세스가 될 수 있습니다. Btw: (같은) 데몬은 sshd"백그라운드로 들어갈 때" 그런 일을 합니다.

그런 일이 발생하지 않으면 고아 프로세스는 나중에(완료되면) 좀비 프로세스가 됩니다. 이는 waitpid()호출되지 않을 때 발생하는 일입니다(해당 프로세스가 종료되면 완료될 수 없는 상위 프로세스의 책임). init는 waitpid()좀비 자식을 피하기 위해 특정 간격으로 호출합니다.

답변4

사용하면 &프로그램이 백그라운드로 실행됩니다. 백그라운드에서 프로그램을 보려면 bgcommand 를 사용하고 다시 포그라운드로 실행되도록 하려면 를 실행하십시오 fg.

예, 기본 터미널이 종료된 경우에도 프로그램을 계속 실행하는 방법에는 여러 가지가 있습니다.

관련 정보