sshfs 设备正忙

sshfs 设备正忙

我使用 sshfs(版本 2.8.4)挂载了一个远程文件系统

sshfs -o allow_root [email protected]: ./example

但卸载失败

> fusermount -u example
umount: /home/joeuser/example: device is busy.
        (In some cases useful info about processes that use
         the device is found by lsof(8) or fuser(1))

关于可能导致此错误的原因以及如何修复它,您有什么想法吗?

答案1

某个程序正在使用您尝试卸载的文件系统中的文件。它可能是已打开以进行读取或写入的文件、当前目录或一些更模糊的情况。它甚至可能是由于文件系统上的目录是挂载点。

要进行调查,请运行lsof +f -- example。它将告诉您哪些进程正在使用文件系统。请自行判断是否让它们关闭文件、终止它们或推迟卸载操作。

使用 FUSE 文件系统(如 SSHFS),您可以终止提供文件系统的进程。FUSE 必须支持此功能,因为进程可能随时终止;如果所有进程尝试访问文件系统,它们都会收到“传输端点未连接”错误。这本身不会卸载文件系统,但有时这是让您的系统摆脱困境的另一种方法。

答案2

我认为你想要一个惰性卸载:

sudo umount -l example

答案3

我刚刚遇到这个问题,无法kill -9从已安装的文件系统读取进程。即使在或(有效)kill -9之后也不起作用。唯一有效的是。fusermount -zu /mount/pointumount -l /mount/pointpkill -9 sshfs

答案4

运行 Ubuntu 时,man fusermount会显示一个-z选项,记录为“延迟卸载”。它似乎相关,但需要确认,此确认由另一个手册页提供:fusermount (man.he.net),表示“延迟卸载(即使资源仍然繁忙也能工作)”。必须使用它-u仅使用选项-z会产生错误。我尝试了该-z选项,可以确认它确实有效,但这太像一个诡计了:它到底是做什么的?让它在目录不再繁忙时自动卸载?我不知道,没有记录,所以不安全。

因此,这里还有另一种选择,更加冗长,但更加安全:循环尝试卸载直至成功,根据需要进行多次尝试。

echo -n "Unmounting...";
fusermount -u -q "$MOUNT_POINT";
OK="$?";

while [ "$OK" != "0" ]
do
   sleep 1;
   echo -n ".";
   fusermount -u -q "$MOUNT_POINT";
   OK="$?";
done

echo;

进度反馈很少,因此人们知道发生了什么并且不相信它已经挂起了。

该选项在 shell 脚本中是可以接受的;对于命令行交互,使用该-z选项更加方便,但可能必须注意手册页没有记录它,并且可能对它到底做什么存在疑问。

相关内容