![FreeBSD에서 프로세스는 어떤 상황에서 고아 프로세스가 됩니까?](https://linux55.com/image/126783/FreeBSD%EC%97%90%EC%84%9C%20%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EB%8A%94%20%EC%96%B4%EB%96%A4%20%EC%83%81%ED%99%A9%EC%97%90%EC%84%9C%20%EA%B3%A0%EC%95%84%20%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EA%B0%80%20%EB%90%A9%EB%8B%88%EA%B9%8C%3F.png)
FreeBSD 7
어떤 이유로 실행 파일(공급업체별 CLI 제공)과 해당 하위 프로세스가 고아가 되는 경우가 있습니다 /usr/sbin/cli
(활성이지만 상위 프로세스는 init
).
# ps -p 7173,7175,1 -o pid,ppid,start,user,command
PID PPID STARTED USER COMMAND
1 0 26Apr17 root /packages/mnt/jbase/sbin/init --
7173 1 31Dec17 test cli -c traceroute 10.10.98.8 as-number-lookup; quit
7175 7173 31Dec17 test /usr/sbin/traceroute -JA 10.10.98.8
#
위와 같이 cli
(프로세스 상태는 idle
) 한 달 전에 시작되었습니다. sshd
(사용자로 실행 )에 의해 root
시작 됩니다 . SSH 클라이언트가 시간 초과되거나 연결이 끊어지면 sshd
프로세스에 어떤 신호가 전송됩니까 ? 프로세스가 이 신호를 무시할 수 있습니까 cli
? SSH 클라이언트를 실행한 다음 연결을 끊어 분석을 cli
시도했지만 신호가 전송되지 않았습니다 . 그런 다음 뒤로 물러서서 실행하고 (프로세스의 상위 ) SSH 클라이언트를 종료했습니다. 이는 다음과 같은 디버그 출력을 제공합니다.truss
truss -f -p <cli PID>
cli
truss -f -p <sshd: freebsd@notty (sshd) PID>
cli
1565: select(13,{ 3 5 7 10 12 },{ },0x0,0x0) = 1 (0x1)
1565: sigprocmask(SIG_BLOCK,{ SIGCHLD },{ }) = 0 (0x0)
1565: sigprocmask(SIG_SETMASK,{ },0x0) = 0 (0x0)
1565: clock_gettime(4,{ 5568.946095396 }) = 0 (0x0)
1565: read(3,"\M^]G)\M-=[\M^Y\M-Z\M-pD\M^O\M^]"...,16384) = 60 (0x3c)
1565: clock_gettime(13,{ 1517409641.000000000 }) = 0 (0x0)
1565: getpid() = 1565 (0x61d)
1565: socket(PF_LOCAL,SOCK_DGRAM,0) = 8 (0x8)
1565: fcntl(8,F_SETFD,FD_CLOEXEC) = 0 (0x0)
1565: connect(8,{ AF_UNIX "/var/run/logpriv" },106) ERR#13 'Permission denied'
1565: connect(8,{ AF_UNIX "/var/run/log" },106) = 0 (0x0)
1565: sendto(8,"<38>Jan 31 14:40:41 sshd[1565]: "...,106,0x0,NULL,0x0) = 106 (0x6a)
1565: close(8) = 0 (0x0)
1565: clock_gettime(13,{ 1517409641.000000000 }) = 0 (0x0)
1565: getpid() = 1565 (0x61d)
1565: socket(PF_LOCAL,SOCK_DGRAM,0) = 8 (0x8)
1565: fcntl(8,F_SETFD,FD_CLOEXEC) = 0 (0x0)
1565: connect(8,{ AF_UNIX "/var/run/logpriv" },106) ERR#13 'Permission denied'
1565: connect(8,{ AF_UNIX "/var/run/log" },106) = 0 (0x0)
1565: sendto(8,"<38>Jan 31 14:40:41 sshd[1565]: "...,74,0x0,NULL,0x0) = 74 (0x4a)
1565: close(8) = 0 (0x0)
1565: geteuid() = 1001 (0x3e9)
1565: unlink("/tmp/ssh-2A9AWQYCLZ/agent.1565") = 0 (0x0)
1565: rmdir(0x804024c40) = 0 (0x0)
1565: process exit, rval = 255
답변1
저는 FreeBSD 사용자는 아니지만 이것은 기본적으로 Unix 문제입니다.
프로세스의 상위 프로세스가 종료될 때마다 해당 프로세스는 고아가 됩니다. 이런 일은 자주 발생하며 일반적으로 문제가 되지 않습니다. 부모의 죽음이 자동으로 자녀를 죽이는 것은 아닙니다.
특정 SSH(및 텔넷 등)의 경우 연결이 끊어지면 쉘은 일반적으로 SIGHUP을 수신합니다. 고아가 아니라 껍질을 죽이는 것입니다. 사용자 정의 CLI가 비표준 방식(즉, 죽지 않음)으로 SIGHUP을 처리하도록 선택하면 어떤 일이 발생할 수 있습니다.