프로세스를 종료하기 위해 nohup을 사용하는 이유는 무엇입니까?

프로세스를 종료하기 위해 nohup을 사용하는 이유는 무엇입니까?

Nohup 개념에 따르면 쉘이 종료될 때 프로세스를 종료하지 않고 백그라운드에서 프로세스를 실행하고 싶습니다. 수동으로 종료할 때까지 다음 명령이 작동해야 합니다.

nohup uwsgi --http :8008  --module crawled_data_center.wsgi > /dev/null &

루트 사용자를 사용하여 셸에 로그인했지만 셸을 종료한 후 프로세스가 종료되었습니다. 몇 가지 프로젝트에서 몇 번 사용했는데 nohup잘 작동했기 때문에 이상해 보이지만 이 경우에는 문제가 있습니다. 문제가 무엇이며 쉘이 종료될 때 이를 죽이지 않고 백그라운드에서 어떻게 실행할 수 있습니까? ?

고쳐 쓰다:

나는 그것을 처리합니다 :

$ nohup uwsgi --http :8008  --module crawled_data_center.wsgi > /dev/null &
$ disown -l
$ disown -h JOBID

하지만 내 질문은 어떻게 SIGHUP살인 nohup이 가능합니까 &?

내용은 다음과 같습니다 /etc/systemd/logind.conf.

[Login]
#NAutoVTs=6
#ReserveVT=6
#KillUserProcesses=no
#KillOnlyUsers=
#KillExcludeUsers=root
Controllers=blkio cpu cpuacct cpuset devices freezer hugetlb memory perf_event net_cls net_prio
ResetControllers=
#InhibitDelayMaxSec=5
#HandlePowerKey=poweroff
#HandleSuspendKey=suspend
#HandleHibernateKey=hibernate
#HandleLidSwitch=suspend
#PowerKeyIgnoreInhibited=no
#SuspendKeyIgnoreInhibited=no
#HibernateKeyIgnoreInhibited=no
#LidSwitchIgnoreInhibited=yes
#IdleAction=ignore
#IdleActionSec=30min

답변1

내가 아는 한, 프로세스가 보호된 후 종료될 수 있는 두 가지 상황이 있으며 nohup, 각 상황마다 해결 방법이 다릅니다.

한 가지 가능성(여기서는 그렇지 않은 것 같습니다)은 시스템 이 logind.conf. KillUserProcesses=yes이 경우 해결책은 다음을 사용하는 것입니다.

$ systemd-run --scope --user [command]

이것은 기본적으로 systemd에게 프로세스를 종료해서는 안 된다는 것을 알려줍니다.

SIGHUP또 다른 가능성은 생성된 프로세스가 재정의된 자체 핸들러를 구현한다는 것입니다 nohup. 이 경우 로그인 상태를 유지하더라도 셸이 닫히면 문제가 발생합니다. 다음을 통해 확인할 수 있습니다:

$ nohup [command] &
$ grep Sig /proc/$!/status

줄이 보이실 텐데요

SigIgn: 0000000000000001

(또는 다른 16진수 문자열). SIGHUP는 신호 번호 1이므로 이 빅엔디안 16진수에 첫 번째(최하위) 비트 세트가 있는 경우(즉, 마지막 숫자는 1, 3, 5, 7, 9, B, D 또는 F 중 하나임) SIGHUP무시되었습니다. 그렇지 않으면 프로그램이 자체 처리기를 설치하여 nohup.

이 경우 해결책은 다음을 사용하는 것입니다 disown.

nohup [command] & disown

이렇게 하면 셸의 작업 목록에서 프로세스가 제거되어 SIGHUP애초에 프로세스가 전송되지 않습니다.

관련 정보