FreeBSDでは、プロセスはどのような状況で孤児プロセスになりますか?

FreeBSDでは、プロセスはどのような状況で孤児プロセスになりますか?

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)1ヶ月前に始まりました。sshd(ユーザーとして実行)によってroot開始されます。 SSHクライアントがタイムアウトした場合、または接続が切断された場合、sshdどの信号がプロセスに送信されますか?プロセスはこの信号を無視できますかcli? SSHクライアントを実行してから接続を切断して分析しようとしcliましたが、シグナルは送信されませんでした。その後、後退して実行し(プロセスの親)SSHクライアントを終了しました。これは次のデバッグ出力を提供します。trusstruss -f -p <cli PID>clitruss -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(およびTelnetなど)の場合、接続が切断されると、シェルは通常SIGHUPを受信します。孤児ではなく、殻を殺すことです。カスタムCLIが非標準的な方法(つまり死ぬことなく)でSIGHUPを処理することを選択すると、何かが発生する可能性があります。

関連情報