zoukankan      html  css  js  c++  java
  • 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
    

     


  • 相关阅读:
    nginx 命令 以及普通搭建图片服务
    安卓开发自定义View流程
    01-flask虚拟环境
    vscode切换虚拟环境报错无法加载文件 E:Python_projectshop_envScriptsActivate.ps1,因为在此系统上禁止运行 脚本。
    01-flask旅行网系统功能设计
    10-Python文件操作
    09-Python异常
    08-Python面对对象进阶
    06-Python元组,列表,字典,集合数据结构
    05-Python模块
  • 原文地址:https://www.cnblogs.com/zjz20/p/13682084.html
Copyright © 2011-2022 走看看