一、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