linux fuser命令


1.fuser找出正在使用某个文件的进程

回到顶部

当你在删除某个文件时,这个文件却被某个进程占用着,这时候是不能删除的。那么怎么找到占用该文件的进程呢? 或者你用umount卸载某个文件系统,却出现了device is busy的提示,这表明文件系统正在被某个进程使用。 这时候就可以使用fuser命令了:

              [root@initroot ~]# fuser [-umv] [-k [i] [-signal]] file/dir
            
选项与参数:
-u :除了进程的PID之外,同时列出该进程的拥有者;
-m :该文件所在的文件系统,后面接的那个文件名会主动的上提到该文件系统的最顶层,对umount不成功很有效!
-v :可以列出每个文件与进程还有指令的完整相关性!
-k :向找到的进程发送信号,信号由-signal指定,如果没有指定信号名或者信号编号,默认为SIGKILL信号;
-i :用户交互模式,必须与-k配合,在删除进程之前会先询问使用者!
-signal:例如 -1 -15 等等,若不加的话,默认是 SIGKILL (-9) 啰!
找出目前所在目录的使用 PID/所属账号/权限 为何。 看看有哪些进程正在使用当前工作目录:
              [root@initroot ~]# fuser -uv .
                                  USER        PID ACCESS COMMAND
              /root:               root       6632 ..c.. (root)bash

              
正在使用当前工作目录的进程为bash进程,进程pid为6632,该进程属于root用户。比较有趣的是ACCESS字段,该字段代表的意义为:
c :此进程在当前的目录下(非次目录);
e :可被触发为执行状态;
f :是一个被开启的文件;
r :代表顶层目录(root directory);
F :该文件被开启了,不过在等待回应中;
m :可能为分享的动态函式库;
-m选项可以查看文件所在的文件系统中有多少进程正在占用该文件系统
找到所有使用/proc这个文件系统的进程吧!
              [root@initroot ~]# fuser -uv /proc
              USER        PID ACCESS COMMAND
              /proc:               root     kernel mount (root)/proc
              rtkit      1436 .rc.. (rtkit)rtkit-daemon
            
数据量还不会很多,虽然这个目录很繁忙~没关系!我们可以继续这样作,看看其他的进程!
              [root@initroot ~]# fuser -mvu /proc
              USER        PID ACCESS COMMAND
              /proc:               root     kernel mount (root)/proc
              root          1 f.... (root)systemd
              root        377 f.... (root)systemd-journal
              systemd-resolve    580 f.... (systemd-resolve)systemd-resolve
              syslog      708 f.... (syslog)rsyslogd
              root        727 f.... (root)udisksd
              root        964 F.... (root)Xorg
              peter      1174 f.... (peter)systemd
              peter      1428 f.... (peter)csd-housekeepin
              rtkit      1436 .rc.. (rtkit)rtkit-daemon
              peter      1474 f.... (peter)gvfs-udisks2-vo
              peter      1553 f.... (peter)nemo-desktop
              peter      1609 f.... (peter)gvfsd-trash
              peter      2180 .rc.. (peter)Web Content
              peter      2289 .rc.. (peter)WebExtensions
              peter      2383 .rc.. (peter)Web Content
              peter      3422 f.... (peter)nemo
              peter      3941 .rc.. (peter)Web Content
              peter      4371 f.... (peter)xreader
              peter      4387 f.... (peter)WebKitNetworkPr
              root       6620 f.... (root)systemd
            
有这几支进程在进行 /proc 文件系统的存取喔!这样清楚了吗?
范例三:找到所有使用到 /home 这个文件系统的进程吧!
先确认一下,自己的 bash PID 号码吧!
              [root@initroot ~]# echo $$
              31743
            
              [root@initroot ~]# cd /home
              [root@initroot home]# fuser -muv .
                        USER PID ACCESS COMMAND
              /home:    root kernel mount (root)/home
              peter 31535 ..c.. (peter)bash
              root 31571 ..c.. (root)passwd
              root 31737 ..c.. (root)sudo
              root 31743 ..c.. (root)bash
            
# 果然,自己的 PID 在啊!
              [root@initroot home]# cd ~
              [root@initroot ~]# umount /home
              umount: /home: target is busy.
              (In some cases useful info about processes that use
              the device is found by lsof(8) or fuser(1))
            
# 从 fuser 的结果可以知道,总共有五只 process 在该目录下运作,那即使 root 离开了 /home, # 当然还是无法 umount 的!那要怎办?哈哈!可以透过如下方法一个一个删除~
              [root@initroot ~]# fuser -mki /home
              /home:
              31535c 31571c 31737c
              # 你会发现, PID 跟上面查到的相同!
              Kill process 31535 ? (y/N) 
            
# 这里会问你要不要删除!当然不要乱删除啦!通通取消! 既然可以针对整个文件系统,那么能不能仅针对单一文件啊?当然可以啰!
看一下底下的案例先:
范例四:找到 /run 底下属于 FIFO 类型的文件,并且找出存取该文件的进程
              [root@initroot ~]# find /run -type p
              .....(前面省略).....
              /run/systemd/sessions/165.ref
              /run/systemd/sessions/1.ref/run/systemd/sessions/c1.ref
            
# 随便抓个项目!就是这个好了!来测试一下!
              [root@initroot ~]# fuser -uv /run/systemd/sessions/c1.ref
              USER
              PID ACCESS COMMAND
              /run/systemd/sessions/c1.ref:
              root 763 f.... (root)systemd-logind
              root 5450 F.... (root)gdm-session-wor
            
通常系统的FIFO文件都会放置到/run目录下,透过这个方式来追踪该文件被存取的process!也能够晓得系统有多忙碌啊!
透过这个 fuser 我们可以找出使用该文件、目录的进程! 他的重点与 ps, pstree 不同。 fuser 可以让我们了解到某个文件 (或文件系统) 目前正在被哪些进程所利用!

initroot编辑整理,转载请注明www.initroot.com

100次点赞 100次阅读