如何找出 ssh 进程挂起的原因?

如何找出 ssh 进程挂起的原因?

当我通过 ssh 运行命令时iostat -dkx 2 2,我得到了预期的结果,但本地计算机上的进程在“可中断睡眠”状态下处于活动状态。为什么会发生这种情况?有没有办法找出该行为的原因?

完整命令:

$ ssh -o ConnectTimeout=4 -o ChallengeResponseAuthentication=no -o PasswordAuthentication=no <user>@host> iostat -dkx 2 2

ps输出:

$ ps aux | grep 11893 && ps aux | grep PID
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
1000       10273  0.0  0.0 103280   904 pts/0    S+   12:09   0:00 grep PID
1000       11893  0.0  0.0 158732  3892 ?        S    Feb17   0:00 ssh -o ConnectTimeout=4 -o ChallengeResponseAuthentication=no -o PasswordAuthentication=no <user>@<host> iostat -dkx 2 2
1000       10285  0.0  0.0 103280   904 pts/0    S+   12:09   0:00 grep 11893

跟踪:

$ strace -p 11893
Process 11893 attached - interrupt to quit
select(8, [5], [], NULL, NULL^C <unfinished ...>

哇:

$ cat /proc/11893/wchan 
poll_schedule_timeout

堆栈跟踪:

$ cat /proc/11893/stack 
[] poll_schedule_timeout+0x39/0x60
[] do_select+0x6bb/0x7c0
[] core_sys_select+0x18a/0x2c0
[] sys_select+0x47/0x110
[] system_call_fastpath+0x16/0x1b
[] 0xffffffffffffffff

答案1

似乎没有什么问题。您正在查看的进程(ssh)在您获取其进程统计信息时根本没有任何关系。

只要远程启动的命令没有输出,“select”就会阻塞,进程就会进入睡眠状态。

答案2

ControlMaster您的配置中有( )吗~/.ssh/config?如果这样做,并且该ssh进程是另一个连接的主连接,则该进程将无法退出。如果这是问题所在,则与 running 无关iostat,保持打开状态的连接是您在没有连接处于活动状态时与此特定服务器建立的第一个连接。

相关内容