在用 Linux 的时候,有时会遇到某个进程死锁住了,并且这个锁死的进程无法被杀死,用 kill -9 都没有反应。遇到这种情况时,有很大的可能是因为该进程正在等待一个 I/O 操作,因此进入了一种称为 uninterruptible sleep 的状态。用 ps axopid,comm,wchan | grep process-name 命令查看该进程,可以看到它的状态是 request_wait_answer。此时该进程无法做任何事情,包括死。

遇到这样的情况时,需要检查一下网络文件系统的挂载情况。绝大部分情况下出现这种现象都是因为 sshfs 到网络主机的连接断开了,但文件系统的挂载点却还在。只要能够移除掉这个失效的网络文件系统挂载,那些死锁的进程就会恢复正常。

然而,此时使用 fusermount -u 取消挂载点是无法成功的,因为 fusermount 在取消挂载的时候也会试图访问失效的挂载点,然后把自己也死锁上去。必须先杀死 sshfs,然后再 fusermount -u 挂载点,一切就会都恢复正常了。在杀死 sshfs 的瞬间你会发现,之前杀不死的那个进程随着 sshfs 的死掉一起跟着死了。

需要注意的是,在杀死 sshfs 之前千万不要进行任何可能访问挂载点的操作,譬如 ls 挂载点所在的目录啊,在挂载点所在的地方使用了 bash 路径补全啊什么的,原因你懂的。