在用 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
路径补全啊什么的,原因你懂的。