fuser、lsof的使用

一、fuser

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

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

# fuser -m -v /dev/sda1

                     用户     进程号 权限   命令
/dev/sda1:           root     kernel mount /boot

运行下面命令杀掉占用此设备的进程 

fuser -m -v -k /dev/sdb1 

或者fuser -m -v -k -i  /dev/sdb1(每杀掉一下进程会让你确认) 

再umount

# fuser -v -n tcp 80  查看80端口占用

                     用户     进程号 权限   命令
80/tcp:              root       2020 F.... nginx
                     nginx      2021 F.... nginx
                     nginx      2022 F.... nginx
                     nginx      2023 F.... nginx

# fuser -n tcp 80

80/tcp:               2020  2021  2022  2023

# ps -ef | grep nginx

root       2020      1  0 22:40 ?        00:00:00 nginx: master process /usr/sbin/nginx
nginx      2021   2020  0 22:40 ?        00:00:00 nginx: worker process
nginx      2022   2020  0 22:40 ?        00:00:00 nginx: worker process
nginx      2023   2020  0 22:40 ?        00:00:00 nginx: worker process
root       2055   1930  0 22:42 pts/0    00:00:00 grep --color=auto nginx

# pgrep nginx(通过进程名查进程)

# pgrep  -l  nginx 
3706 nginx
3707 nginx
3708 nginx

# netstat -anptl | grep 80

tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      2020/nginx: master  
tcp        0      0 192.168.40.132:22       192.168.40.1:58019      ESTABLISHED 1924/sshd: root@pts
tcp6       0      0 :::80                   :::*                    LISTEN      2020/nginx: master  

二、lsof

lsof的选项

-a:列出打开文件存在的进程; 
-c<进程名>:列出指定进程所打开的文件; 
-g:列出GID号进程详情; 
-d<文件号>:列出占用该文件号的进程; 
+d<目录>:列出目录下被打开的文件; 
+D<目录>:递归列出目录下被打开的文件; 
-n<目录>:列出使用NFS的文件; 
-i<条件>:列出符合条件的进程。(4、6、协议、:端口、 @ip ) 
-p<进程号>:列出指定进程号所打开的文件; 
-u:列出UID号进程详情; 
-h:显示帮助信息; 
-v:显示版本信息。

1、查看端口占用

lsof -i:80

# nc -l 80  (nc方式)
Ncat: bind to :::80: Address already in use. QUITTING.

ss方式查看80端口占用

ss -lp src :80

2、查看系统当前打开的文件描述符数量

第一个数表示当前系统分配后已使用的文件描述符数,第二个数表示分配后未使用的(内核2.6版本中这个值总是为0,这并不是一个错误,它意味着已经分配的文件描述符总会被使用),第三个数等于最大值f。

cat /proc/sys/fs/file-nr 
1440	0	176997

查看docker.sock占用的文件描述符数量
lsof /var/run/docker.sock | wc -l
1025

列出pid
sudo lsof  -t  /var/run/docker.sock
1
2187

列出指定进程所打开的文件
sudo lsof -c docker

3、查看某个进程打开的文件描述符数量

# lsof -p 2486 |wc -l  (nginx master进程)
59

4、看下哪些进程占用的文件描述符比较多,排序

# lsof -n | more
COMMAND    PID  TID TASKCMD             USER   FD      TYPE             DEVICE  SIZE/OFF       NODE NAME
systemd      1                          root  cwd       DIR              253,0       256        128 /
systemd      1                          root  rtd       DIR              253,0       256        128 /

#lsof -n |awk '{print $2}'|sort|uniq -c |sort -nr |head -10
   2584 982
    376 865
    360 874
    279 1429
    116 988
    111 989
    110 858
     92 1
     88 875
     79 1459

注lsof -n输出解读:

  • COMMAND:进程的名称
  • PID:进程标识符
  • USER:进程所有者
  • FD:文件描述符,应用程序通过文件描述符识别该文件。如cwd、txt等
  • TYPE:文件类型,如DIR、REG等
  • DEVICE:指定磁盘的名称
  • SIZE:文件的大小
  • NODE:索引节点(文件在磁盘上的标识)
  • NAME:打开文件的确切名称

df方式查看inode剩余情况

$ df -Thi
文件系统                      类型     Inode 已用(I) 可用(I) 已用(I)% 挂载点
/dev/sda3                     xfs        24M    407K     24M       2% /
devtmpfs                      devtmpfs  2.0M     477    2.0M       1% /dev
tmpfs                         tmpfs     2.0M       1    2.0M       1% /dev/shm
tmpfs                         tmpfs     2.0M     924    2.0M       1% /run
tmpfs                         tmpfs     2.0M      16    2.0M       1% /sys/fs/cgroup
/dev/sda1                     vfat         0       0       0        - /boot/efi
10.1.1.2:/mnt/data/nfs/public nfs       1.4G     48M    1.3G       4% /mnt/nfs
tmpfs                         tmpfs     2.0M       1    2.0M       1% /run/user/1000

ls方式查看文件inode号

$ ls  -i fm-package
 
100891313 fingerprint-celery.tar.gz     34343355 fingerprint-web      

5、已知进程pid,查进程用户

查看进程ID

#netstat -nltp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      870/sshd            
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      2486/nginx: master  
tcp6       0      0 :::22                   :::*                    LISTEN      870/sshd            
tcp6       0      0 :::33060                :::*                    LISTEN      982/mysqld          
tcp6       0      0 :::3306                 :::*                    LISTEN      982/mysqld          
tcp6       0      0 :::80                   :::*                    LISTEN      2486/nginx: master 

 进入/proc目录查找相应进程ID目录并进入此目录

# cd /proc/2486

在进程ID目录中查找exe连接,后面就是运行进程ID对应文件的绝对路径

#ll | grep exe
lrwxrwxrwx 1 root root 0 Sep 24 21:01 exe -> /usr/sbin/nginx

 或者ps  -p  port根据进程查软件名

ps -p 2486
    PID TTY          TIME CMD
   2486 ?        00:00:00 nginx

6、用lsof恢复被删数据

误删除文件且进程还在

#备份
 cp /var/log/message /var/log/message_bac

 lsof |grep /var/log/message
rsyslogd   1737      root    1w      REG                8,2   5716123     652638 /var/log/messages

进程在运行中,接下来我就把/var/log/messages这个文件删掉

 rm /var/log/messages

 删掉之后,我再来看看这个进程的变化

lsof |grep /var/log/messages
rsyslogd   1737      root    1w      REG         8,2   5716123     652638 /var/log/messages (deleted)

PID:1737 FD:1 那我们有直接进入/proc/1737/FD/1用ll查看一下

# cd /proc/1737/fd/
# ll
total 0
lrwx------ 1 root root 64 Dec 23 13:00 0 -> socket:[11442]
l-wx------ 1 root root 64 Dec 23 13:00 1 -> /var/log/messages (deleted)
l-wx------ 1 root root 64 Dec 23 13:00 2 -> /var/log/secure
lr-x------ 1 root root 64 Dec 23 13:00 3 -> /proc/kmsg
l-wx------ 1 root root 64 Dec 23 13:00 4 -> /var/log/maillog

看到了1对应/var/log/messages (deleted),看看文件是不是我们要的文件:

> head -5 1
Nov 14 03:11:11 localhost kernel: imklog 5.8.10, log source = /proc/kmsg started.
Nov 14 03:11:11 localhost rsyslogd: [origin software="rsyslogd" swVersion="5.8.10" x-pid="1241" x-info="http://www.rsyslog.com"] start
Nov 14 03:11:11 localhost kernel: Initializing cgroup subsys cpuset
Nov 14 03:11:11 localhost kernel: Initializing cgroup subsys cpu
Nov 14 03:11:11 localhost kernel: Linux version 2.6.32-431.el6.x86_64 (mockbuild@c6b8.bsys.dev.centos.org) (gcc version 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC) ) #1 SMP Fri Nov 22 03:15:09 UTC 2013

对比备份文件:

head -5 /var/log/message_bac
Nov 14 03:11:11 localhost kernel: imklog 5.8.10, log source = /proc/kmsg started.
Nov 14 03:11:11 localhost rsyslogd: [origin software="rsyslogd" swVersion="5.8.10" x-pid="1241" x-info="http://www.rsyslog.com"] start
Nov 14 03:11:11 localhost kernel: Initializing cgroup subsys cpuset
Nov 14 03:11:11 localhost kernel: Initializing cgroup subsys cpu
Nov 14 03:11:11 localhost kernel: Linux version 2.6.32-431.el6.x86_64 (mockbuild@c6b8.bsys.dev.centos.org) (gcc version 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC) ) #1 SMP Fri Nov 22 03:15:09 UTC 2013

对比发现数据是一样的,恢复

 cat 1 > /var/log/messages    依情况而定,有可能是2或者4

 误删除文件且进程不存在(extundelete工具)

这种情况一般是没有守护进程或者后台进程对其持续输入,所以删除就删除了,lsof也看不到。就要借助于工具。这里我们采用的工具是extundelete第三方工具。恢复步骤如下:

1.停止对当前分区做任何操作,防止inode被覆盖。inode被覆盖基本就告别恢复了。比如停止所在分区的服务,卸载目录所在的设备,有必要的情况下都可以断网。

2.通过dd命令对当前分区进行备份,防止第三方软件恢复失败导致数据丢失。适合数据非常重要的情况,这里测试,就没有备份,如备份可以考虑如下方式:

https://mp.weixin.qq.com/s/2NA5kQ1ta6HJNo2HrSTajg  有待学习

df -i  /var/log/nginx/error.log
Filesystem            Inodes IUsed    IFree IUse% Mounted on
/dev/mapper/cl-root 23150592 44428 23106164    1% /

7、列出所有的网络链接

#lsof -i
COMMAND    PID              USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
chronyd    724            chrony    5u  IPv4  22867      0t0  UDP localhost:323 
chronyd    724            chrony    6u  IPv6  22868      0t0  UDP localhost:323 
sshd       931              root    3u  IPv4  22431      0t0  TCP *:ssh (LISTEN)
sshd       931              root    4u  IPv6  22433      0t0  TCP *:ssh (LISTEN)
master    1139              root   13u  IPv4  24257      0t0  TCP localhost:smtp (LISTEN)
master    1139              root   14u  IPv6  24258      0t0  TCP localhost:smtp (LISTEN)
gitlab-ex 1378               git    5u  IPv4  25157      0t0  TCP localhost:9168 (LISTEN)
gitlab-ex 1378               git    6u  IPv6  25158      0t0  TCP localhost:9168 (LISTEN)
gitlab-ex 1378               git   14u  IPv6  26928      0t0  TCP localhost:9168->localhost:43738 (ESTABLISHED)
gitlab-ex 1378               git   18u  IPv6  27729      0t0  TCP localhost:9168->localhost:43744 (ESTABLISHED)

根据文件描述范围列出文件信息

#lsof -d 2-3
COMMAND    PID              USER   FD      TYPE             DEVICE SIZE/OFF      NODE NAME
systemd      1              root    2u      CHR                1,3      0t0      1030 /dev/null
systemd      1              root    3u  a_inode                0,9        0      8023 [timerfd]
systemd-j  489              root    2w      CHR                1,3      0t0      1030 /dev/null
systemd-j  489              root    3u     unix 0xffff88016b566800      0t0      1420 /run/systemd/journal/std
lvmetad    512              root    2u     unix 0xffff88016b6ae800      0t0     16392 socket
lvmetad    512              root    3u     unix 0xffff8800bb30f800      0t0     11203 /run/lvm/lvmetad.socket
systemd-u  517              root    2u     unix 0xffff88003652b400      0t0     16316 socket

 


原文地址:https://www.cnblogs.com/zjz20/p/13682084.html