Linux fuser 命令详解

简介: fuser命令小结linux环境下,当使用umount命令卸载挂载点时,会遇到“device is busy”提示,这时fuser就能查出谁在使用这个资源;当然umount –lf [挂载点] 也可以强制卸载功能fuser 可以显示出当前哪个程序在使用磁盘上的某个文件挂载点甚至网络端口并给出程序进程的详细信息.fuser只把PID输出到标准输出,其他的都输出到标准错误输出。

fuser命令小结

linux环境下,当使用umount命令卸载挂载点时,会遇到“device is busy”提示,这时fuser就能查出谁在使用这个资源;当然umount –lf [挂载点] 也可以强制卸载

功能

fuser 可以显示出当前哪个程序在使用磁盘上的

某个文件
挂载点
甚至网络端口

并给出程序进程的详细信息.

fuser只把PID输出到标准输出,其他的都输出到标准错误输出。

常用选项

-a 显示所有命令行中指定的文件,默认情况下被访问的文件才会被显示。
-c 和-m一样,用于POSIX兼容。
-k 杀掉访问文件的进程。如果没有指定-signal就会发送SIGKILL信号。结合 –signal

-signal 使用指定的信号,而不是用SIGKILL来杀掉进程。可以通过名称或者号码来表示信号(例如-HUP,-1),这个选项要和-k一起使用,否则会被忽略。

-l 列出所有已知的信号名称。
-i 杀掉进程之前询问用户,如果没有-k这个选项会被忽略。
-m name 指定一个挂载文件系统上的文件或者被挂载的块设备(名称name)。这样所有访问这个文件或者文件系统的进程都会被列出来。如果指定的是一个目录会自动转换成"name/",并使用所有挂载在那个目录下面的文件系统。
-n space 指定一个不同的命名空间(space).这里支持不同的空间文件(文件名,此处默认)、tcp(本地tcp端口)、udp(本地udp端口)。对于端口,可以指定端口号或者名称,如果不会引起歧义那么可以使用简单表示的形式,例如:name/space (即形如:80/tcp之类的表示)。
-s 静默模式,这时候-u,-v会被忽略。-a不能和-s一起使用。
-u 在每个PID后面添加进程拥有者的用户名称。
-v 详细模式。输出似ps命令的输出,包含PID,USER,COMMAND等许多域,如果是内核访问的那么PID为kernel.

案例

假设无法卸载的设备为/dev/sdb1
1)运行下面命令看一下哪个用户哪个进程占用着此设备
fuser -m -v /dev/sdb1

2)运行下面命令杀掉占用此设备的进程
fuser -m -v -k /dev/sdb1
或者fuser -m -v -k -i /dev/sdb1(每杀掉一下进程会让你确认)
3)再umount

查看那些程序使用tcp的80端口:
$fuser -n tcp 80
或$fuser -v -n tcp 80
或$fuser -v 80/tcp
这里,后两种方式显示的信息比较全,因为有了-v选项

# fuser -v 111/udp 111/tcp 
                     用户     进程号 权限   命令
111/udp:             rpc         968 F.... rpcbind
111/tcp:             rpc         968 F.... rpcbind

如上例子中第4列的权限也成访问类型,如下:

c 代表当前目录                              F 打开的文件,用于写操作。默认不显示。

e 可执行的被运行                          m 映射文件或者共享库。

f 打开的文件。默认不显示。         r 根目录。    

其它相同命令:

# netstat -lntup|grep 111
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      968/rpcbind         
tcp        0      0 :::111                      :::*                        LISTEN      968/rpcbind         
udp        0      0 0.0.0.0:111                 0.0.0.0:*                               968/rpcbind         
udp        0      0 :::111                      :::*                                    968/rpcbind
# ss  -lntup|grep 111       
udp    UNCONN     0      0                      *:111                   *:*      users:(("rpcbind",968,6))
udp    UNCONN     0      0                     :::111                  :::*      users:(("rpcbind",968,9))
tcp    LISTEN     0      128                   :::111                  :::*      users:(("rpcbind",968,11))
tcp    LISTEN     0      128                    *:111                   *:*      users:(("rpcbind",968,8))
# lsof -i :111
COMMAND PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
rpcbind 968  rpc    6u  IPv4  11275      0t0  UDP *:sunrpc 
rpcbind 968  rpc    8u  IPv4  11278      0t0  TCP *:sunrpc (LISTEN)
rpcbind 968  rpc    9u  IPv6  11280      0t0  UDP *:sunrpc 
rpcbind 968  rpc   11u  IPv6  11283      0t0  TCP *:sunrpc (LISTEN)

signal列表

# fuser -l
HUP INT QUIT ILL TRAP ABRT IOT BUS FPE KILL USR1 SEGV USR2 PIPE ALRM TERM
STKFLT CHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM PROF WINCH IO PWR SYS
UNUSED

# kill -l
 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP
 6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR1
11) SIGSEGV     12) SIGUSR2     13) SIGPIPE     14) SIGALRM     15) SIGTERM
16) SIGSTKFLT   17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO       30) SIGPWR
31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3
38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7
58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX

详细使用命令 man 7signal

fuser功能

fuser 可以显示出当前哪个程序在使用磁盘上的某个文件、挂载点、甚至网络端口,并给出程序进程的详细信息.

fuser显示使用指定文件或者文件系统的进程ID.默认情况下每个文件名后面跟一个字母表示访问类型。

访问类型如下:

c 代表当前目录  
e 将此文件作为程序的可执行对象使用 
f 打开的文件。默认不显示。  
F 打开的文件,用于写操作。默认不显示。  
r 根目录。  
m 映射文件或者共享库。 
s 将此文件作为共享库(或其他可装载对象)使用
当指定的文件没有被访问,或者出现错误的时候,fuser会返回非零。  
为了查看使用tcp和udp套接字的进程,需要-n选项并指定名称空间。默认IpV4和IpV6都会显示。套接字可以是本地的或者是远程的端口,和远程的地址。所有的域是可选的,但是其前面的','必须存在。如下:  
[lcl_port][,[rmt_host][,[rmt_port]]]  
对于ip地址和port,名称和数字表示都可以使用。  
fuser只把PID输出到标准输出,其他的都输出到标准错误输出。  
常用选项 
-a 显示所有命令行中指定的文件,默认情况下被访问的文件才会被显示。  
-c 和-m一样,用于POSIX兼容。  
-k 杀掉访问文件的进程。如果没有指定-signal就会发送SIGKILL信号。  
-i 杀掉进程之前询问用户,如果没有-k这个选项会被忽略。  
-l 列出所有已知的信号名称。  
-m name 指定一个挂载文件系统上的文件或者被挂载的块设备(名称name)。这样所有访问这个文件或者文件系统的进程都会被列出来。如果指定的是一个目录会自动转换成"name/",并使用所有挂载在那个目录下面的文件系统。  
-n space 指定一个不同的命名空间(space).这里支持不同的空间文件(文件名,此处默认)、tcp(本地tcp端口)、udp(本地udp端口)。对于端口, 可以指定端口号或者名称,如果不会引起歧义那么可以使用简单表示的形式,例如:name/space (即形如:80/tcp之类的表示)。  
-s 静默模式,这时候-u,-v会被忽略。-a不能和-s一起使用。  
-signal 使用指定的信号,而不是用SIGKILL来杀掉进程。可以通过名称或者号码来表示信号(例如-HUP,-1),这个选项要和-k一起使用,否则会被忽略。  
-u 在每个PID后面添加进程拥有者的用户名称。  
-v 详细模式。输出似ps命令的输出,包含PID,USER,COMMAND等许多域,如果是内核访问的那么PID为kernel.  -V 输出版本号。  
-4 使用IPV4套接字,不能和-6一起应用,只在-n的tcp和udp的命名存在时不被忽略。  
-6 使用IPV6套接字,不能和-4一起应用,只在-n的tcp和udp的命名存在时不被忽略。  
- 重置所有的选项,把信号设置为SIGKILL.  

使用示例

显示使用某个文件的进程信息

$ fuser -um /dev/sda2  
/dev/sda2:            6378c(quietheart)  6534c(quietheart)  6628(quietheart)  
6653c(quietheart)  7429c(quietheart)  7549c(quietheart)  7608c(quietheart)  

这个命令在umount的时候很有用,可以找到还有哪些用到这个设备了。
杀掉打开readme文件的程序

$fuser -m -k -i readme  

这里,会在kill之前询问是否确定。最好加上-v以便知道将要杀那个进程。
查看那些程序使用tcp的80端口

$fuser -v -n tcp 80  

$fuser -v 80/tcp  

fuser不同信号的应用

用 -l参数可以列出fuser所知的信号

fuser -l

HUP INT QUIT ILL TRAP ABRT IOT BUS FPE KILL USR1 SEGV USR2 PIPE ALRM TERM
STKFLT CHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM PROF WINCH IO PWR SYS
UNUSED

fuser可以发送它已知的信号给访问的指定文件进程而代替-k参数默认发送的SIGKILL,例如:只是挂起进程,那么发送HUP信号就可以了

fuser -v /root/install.log

                  用户     进程号 权限   命令

/root/install.log: root 3347 f.... tail

fuser -k -SIGHUP /root/install.log

/root/install.log: 3347

fuser -v /root/install.log

参考至:http://hi.baidu.com/bossyt/item/020e2cddf09463ee3cc2cb1a
http://wenku.baidu.com/view/7e42df3667ec102de2bd8927.html
http://blog.sina.com.cn/s/blog_59af21260100tv1m.html

相关文章
|
11天前
|
Web App开发 Linux 网络安全
工作中常用到的Linux命令
工作中常用到的Linux命令
|
11天前
|
Web App开发 Java Linux
Linux之Shell基本命令篇
Linux之Shell基本命令篇
Linux之Shell基本命令篇
|
8天前
|
NoSQL Linux Shell
常用的 Linux 命令
常用的 Linux 命令
30 9
|
1天前
|
安全 Linux 开发工具
Linux中可引起文件时间戳改变的相关命令
【4月更文挑战第12天】Linux中可引起文件时间戳改变的相关命令
8 0
|
2天前
|
域名解析 网络协议 Linux
Linux 中的 Nslookup 命令怎么使用?
【4月更文挑战第12天】
21 6
Linux 中的 Nslookup 命令怎么使用?
|
3天前
|
运维 网络协议 Unix
18.系统知识-Linux常用命令
18.系统知识-Linux常用命令
|
4天前
|
网络协议 Ubuntu Linux
Linux 下 TFTP 服务搭建及 U-Boot 中使用 tftp 命令实现文件下载
Linux 下 TFTP 服务搭建及 U-Boot 中使用 tftp 命令实现文件下载
|
4天前
|
Linux Go
Linux命令Top 100驱动人生! 面试必备
探索Linux命令不再迷茫!本文分10部分详解20个基础命令,带你由浅入深掌握文件、目录管理和文本处理。 [1]: <https://cloud.tencent.com/developer/article/2396114> [2]: <https://pan.quark.cn/s/865a0bbd5720> [3]: <https://yv4kfv1n3j.feishu.cn/docx/MRyxdaqz8ow5RjxyL1ucrvOYnnH>
48 0
|
7天前
|
缓存 运维 监控
Linux系统监控利器:探索常用命令及数据保存技巧
Linux系统监控利器:探索常用命令及数据保存技巧
23 4
Linux系统监控利器:探索常用命令及数据保存技巧
|
10天前
|
Linux 索引
linux 文件查找 和文件管理常用命令
linux 文件查找 和文件管理常用命令
19 0