您是否曾尝试卸载 USB 驱动器时收到“设备或资源忙 (Device or Resource Busy)”错误?这个常见问题发生时,是因为某个进程仍在占用设备上的文件或目录。要解决此问题,您需要找出是哪个进程占用了该资源。用于此任务的两个强大工具是 lsof 和 fuser。
使用 lsof 列出打开的文件
在 Linux 中,几乎所有内容都被视为文件,包括磁盘、管道、网络套接字和设备。lsof 命令(“list open files”的缩写)会向您显示所有打开的文件及其使用它们的进程的详细列表。
要查看哪些进程正在使用当前目录(.),您可以运行:
pete@icebox:~$ lsof .
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
lxsession 1491 pete cwd DIR 8,6 4096 131 .
update-no 1796 pete cwd DIR 8,6 4096 131 .
nm-applet 1804 pete cwd DIR 8,6 4096 131 .
xterm 2205 pete cwd DIR 8,6 4096 131 .
bash 2207 pete cwd DIR 8,6 4096 131 .
lsof 5914 pete cwd DIR 8,6 4096 131 .
输出显示了与每个打开文件相关的命令(COMMAND)、进程 ID(PID)和用户(USER)。有了这些信息,您就可以识别出阻止您卸载设备的进程。
fuser 命令
另一个优秀的工具是 fuser 命令(“file user”的缩写)。此实用程序用于识别哪些进程正在使用特定的文件、套接字或文件系统。linux fuser 命令是快速查看访问特定资源的进程 PID 的方法。
使用 -v(详细)选项会提供更详细的输出:
pete@icebox:~$ fuser -v .
USER PID ACCESS COMMAND
/home/pete: pete 1491 ..c.. lxsession
pete 1796 ..c.. update-notifier
pete 1804 ..c.. nm-applet
pete 2205 ..c.. xterm
pete 2207 ..c.. bash
在这里,我们可以清楚地看到哪些进程正在使用我们的当前目录。ACCESS 列显示了文件是如何被使用的(例如,c 代表当前目录)。
使用 fuser 终止进程
fuser 命令的一个关键特性是它能够终止正在使用资源的进程。fuser -k 选项会向访问指定文件或文件系统的每个进程发送 SIGKILL 信号。这对于卸载忙碌的设备特别有用。
例如,要杀死所有使用挂载点 /mnt/usb 的进程,您将运行:
sudo fuser -k /mnt/usb
在 Linux 中使用 fuser -k 是一种快速有效释放资源的方法。
fuser 与 lsof 的比较
那么,您应该何时使用 fuser 而不是 lsof 呢?
lsof非常适合详细调查。它提供了关于所有打开文件的广泛信息,是复杂故障排除的理想选择。fuser更直接。它非常适合快速识别并(如果需要)终止特定文件或挂载点上的进程。fuser command通常是解决“设备或资源忙”错误的更快选择。
这两个工具对任何 Linux 用户来说都是必不可少的。熟悉它们可以帮助您高效地管理文件和进程。