有时您需要卸载文件系统或分离循环设备,但这是busy因为打开的文件描述符,可能是因为smb服务器进程。
要强制卸载,您可以终止有问题的进程(或 try kill -SIGTERM),但这会关闭smb连接(即使它打开的某些文件不需要关闭)。
这里描述了一种强制进程关闭给定文件描述符的hacky方法,使用gdb调用close(fd). 然而,这似乎很危险。如果关闭的描述符被回收怎么办?该进程可能会使用旧的存储描述符而没有意识到它现在指的是一个完全不同的文件。
我有一个想法,但不知道它有什么样的缺陷:使用gdb,打开/dev/null方式O_WRONLY(编辑:建议O_PATH作为更好的选择的评论),然后dup2关闭有问题的文件描述符并将其描述符重用于/dev/null. 这样,对文件描述符的任何读取或写入都将失败。
像这样:
sudo gdb -p 234532
(gdb) set $dummy_fd = open("/dev/null", 0x200000) // O_PATH
(gdb) p dup2($dummy_fd, offending_fd)
(gdb) p close($dummy_fd)
(gdb) detach
(gdb) quit
Run Code Online (Sandbox Code Playgroud)
什么可能出错?
Fish协议是一种基于 ssh的ftp,据称不需要服务器端的特殊软件(与 scp 和 sftp 不同)。
粗略地看一下,如果服务器没有安装 Fish 软件,它似乎允许 Fish 命令回退到基本的 shell 命令。但为什么不直接使用 shell 命令呢?
(上面链接的问题解释了各种协议之间的差异,但它没有解释 Fish 的机制,或者如果您无论如何都要发送等效的 shell 命令,为什么还要费心使用协议。)
我想 grep 一种搜索模式,但只有在只有一个唯一匹配项时才会成功(并输出匹配行)。如果两行匹配,grep 应该失败或不输出任何内容。
该/proc/devices文件按主要修订号和名称列出设备。在我的系统上它显示(部分):
Block devices:
259 blkext
7 loop
8 sd
9 md
11 sr
65 sd
66 sd
67 sd
68 sd
69 sd
70 sd
71 sd
128 sd
129 sd
130 sd
131 sd
132 sd
133 sd
134 sd
135 sd
253 device-mapper
254 mdp
Run Code Online (Sandbox Code Playgroud)
那些“sd”设备是什么?第一个(修订号 8)可能是,/dev/sda但其余的没有出现/dev- 没有带有这些主要修订号的设备。
我确实看到了设备列表:
crw-rw---- 1 root tty 7, 128 Jul 29 14:15 vcsa
crw-rw---- 1 root tty 7, 129 Jul 29 14:15 vcsa1
crw-rw---- …Run Code Online (Sandbox Code Playgroud)