losf含义是"列出打开的文件",用于找出哪些文件被哪个进程打开。我们都知道,Linux/Unix把一切看成文件(管道、套接字、目录、设备等)。使用lsof命令的其中一个原因是说文件正在被使用时不能卸载一个磁盘。在这个命令的帮助下,我们能够简单地识别哪些文件在用。
1、用lsof命令列出所有打开地文件
在以下示例中,它显示一个打开的文件的长列表,为了更好理解哪些显示如Command, PID, USER,FD, TYPE等的列,选取了其中一些打开文件。
[root@areadetector blctrl]# lsof
lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
Output information may be incomplete.
COMMAND PID TID TASKCMD USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root cwd DIR 253,0 224 128 /
systemd 1 root rtd DIR 253,0 224 128 /
systemd 1 root txt REG 253,0 1601320 805380087 /usr/lib/systemd/systemd
systemd 1 root mem REG 253,0 1598808 1369 /usr/lib64/libm-2.28.so
systemd 1 root mem REG 253,0 636712 5107 /usr/lib64/libudev.so.1.6.11
systemd 1 root mem REG 253,0 735192 1426 /usr/lib64/libsepol.so.1
...
sssd 1550 root 0r a_inode 0,14 0 10650 inotify
sssd 1550 root 1u unix 0xffff8acfd1ec0d80 0t0 24315 type=STREAM
sssd 1550 root 2u unix 0xffff8acfd1ec0d80 0t0 24315 type=STREAM
sssd 1550 root 3w REG 253,0 2075 268710206 /var/log/sssd/sssd.log
sssd 1550 root 4u a_inode 0,14 0 10650 [eventpoll]
sssd 1550 root 5r REG 253,0 9253600 356601 /var/lib/sss/mc/passwd (deleted)
我们将更加准确地回顾FD和TYPE列。
FD:代表文件描述符并且可能见到以下某些值:
- CWD:当前目录
- rtd:根目录
- txt:程序文本(代码和数据)
- mem:内存映射文件
在FD列,像1u的数值是实际文件描述符并且后跟它的模式u,r,w,如:
- r:对应读权限
- w:对应写权限
- u:对应读写权限
TYPE:文件的类型和它的标识符
- DIR:目录
- REG:常规文件
- CHR:字符特殊文件
- FIFO:先进先出
2、列出特定用户打开的文件
以下命令将显示用户blctrl的所有打开文件的列表。
[root@rockygu ~]# lsof -u blctrl
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
caRepeate 37191 blctrl cwd DIR 253,1 257 128 /
caRepeate 37191 blctrl rtd DIR 253,1 257 128 /
3、查找运行在特定端口上的进程
要查找所有运行在特定端口上的Linux进程,只要使用带-i选项的以下命令。以下示例将列出所有端口22上的运行进程。
[root@areadetector blctrl]# lsof -i TCP:22
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 1813 root 5u IPv4 32127 0t0 TCP *:ssh (LISTEN)
sshd 1813 root 7u IPv6 32129 0t0 TCP *:ssh (LISTEN)
sshd 19240 root 5u IPv4 1409034 0t0 TCP RockyLinux.blctrl.com:ssh->blctrl-KVM:58946 (ESTABLISHED)
sshd 19258 blctrl 5u IPv4 1409034 0t0 TCP RockyLinux.blctrl.com:ssh->blctrl-KVM:58946 (ESTABLISHED)
sshd 82828 root 5u IPv4 5346805 0t0 TCP RockyLinux.blctrl.com:ssh->LAPTOP-NE29DR6I:55206 (ESTABLISHED)
sshd 82832 root 5u IPv4 5346846 0t0 TCP RockyLinux.blctrl.com:ssh->LAPTOP-NE29DR6I:55207 (ESTABLISHED)
sshd 82833 blctrl 5u IPv4 5346805 0t0 TCP RockyLinux.blctrl.com:ssh->LAPTOP-NE29DR6I:55206 (ESTABLISHED)
sshd 82910 blctrl 5u IPv4 5346846 0t0 TCP RockyLinux.blctrl.com:ssh->LAPTOP-NE29DR6I:55207 (ESTABLISHED)
4、只列出IPv4和IPv6打开文件
在以下示例中只显示用单独命令打开的IPv4和IPv6网络文件。
[root@areadetector blctrl]# lsof -i 4
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root 41u IPv4 25061 0t0 TCP *:sunrpc (LISTEN)
systemd 1 root 42u IPv4 25062 0t0 UDP *:sunrpc
rpcbind 1520 rpc 4u IPv4 25061 0t0 TCP *:sunrpc (LISTEN)
rpcbind 1520 rpc 5u IPv4 25062 0t0 UDP *:sunrpc
avahi-dae 1570 avahi 15u IPv4 41741 0t0 UDP *:mdns
avahi-dae 1570 avahi 17u IPv4 41743 0t0 UDP *:35629
chronyd 1602 chrony 6u IPv4 15883 0t0 UDP localhost:323
NetworkMa 1804 root 28u IPv4 60220 0t0 UDP RockyLinux.blctrl.com:bootpc->RT-AC68U-9750:bootps
sshd 1813 root 5u IPv4 32127 0t0 TCP *:ssh (LISTEN)
dnsmasq 2776 dnsmasq 3u IPv4 66668 0t0 UDP *:bootps
dnsmasq 2776 dnsmasq 5u IPv4 66671 0t0 UDP areadetector:domain
dnsmasq 2776 dnsmasq 6u IPv4 66672 0t0 TCP areadetector:domain (LISTEN)
gnome-she 3321 blctrl 45u IPv4 5474339 0t0 TCP RockyLinux.blctrl.com:60842->master1.openshift4.gnome.org:https (CLOSE_WAIT)
qemu-kvm 4799 qemu 13u IPv4 88361 0t0 TCP localhost:rfb (LISTEN)
qemu-kvm 4877 qemu 13u IPv4 42820 0t0 TCP localhost:5901 (LISTEN)
qemu-kvm 5011 qemu 29u IPv4 30250 0t0 TCP localhost:5902 (LISTEN)
qemu-kvm 5083 qemu 12u IPv4 30262 0t0 TCP localhost:5903 (LISTEN)
[root@areadetector blctrl]# lsof -i 6
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root 43u IPv6 25063 0t0 TCP *:sunrpc (LISTEN)
systemd 1 root 44u IPv6 25064 0t0 UDP *:sunrpc
rpcbind 1520 rpc 6u IPv6 25063 0t0 TCP *:sunrpc (LISTEN)
rpcbind 1520 rpc 7u IPv6 25064 0t0 UDP *:sunrpc
avahi-dae 1570 avahi 16u IPv6 41742 0t0 UDP *:mdns
avahi-dae 1570 avahi 18u IPv6 41744 0t0 UDP *:50763
chronyd 1602 chrony 7u IPv6 15884 0t0 UDP localhost:323
sshd 1813 root 7u IPv6 32129 0t0 TCP *:ssh (LISTEN)
mysqld 1903 mysql 22u IPv6 16054 0t0 TCP *:mysqlx (LISTEN)
mysqld 1903 mysql 24u IPv6 41830 0t0 TCP *:mysql (LISTEN)
sshd 82833 blctrl 14u IPv6 5368953 0t0 TCP localhost:x11-ssh-offset (LISTEN)
5、列出范围1-1024的TCP端口打开文件
要列出所有运行进程TCP端口范围从1-1024的打开文件。
[root@rockygu ~]# lsof -i TCP:1-1024
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root 87u IPv6 190030 0t0 TCP *:telnet (LISTEN)
sshd 1137 root 5u IPv4 24940 0t0 TCP *:ssh (LISTEN)
AliYunDun 128280 root 17u IPv4 1680017 0t0 TCP rockygu:48102->100.100.30.25:http (ESTABLISHED)
sshd 213769 root 5u IPv4 1688592 0t0 TCP rockygu:ssh->xxx.226.222.208:63161 (ESTABLISHED)
sshd 213771 root 5u IPv4 1688592 0t0 TCP rockygu:ssh->xxx.226.222.208:63161 (ESTABLISHED)
sshd 213772 root 5u IPv4 1688683 0t0 TCP rockygu:ssh->xxx.226.222.208:63162 (ESTABLISHED)
sshd 213815 root 5u IPv4 1688683 0t0 TCP rockygu:ssh->xxx.226.222.208:63162 (ESTABLISHED)
6、用'^'字符排除用户
我们已经排除了root用户。你可以按如下所示对这个命令使用'^'排除一个特定用户。
[root@rockygu ~]# lsof -i -u^root
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
chronyd 741 chrony 6u IPv4 20754 0t0 UDP localhost:323
chronyd 741 chrony 7u IPv6 20755 0t0 UDP localhost:323
caRepeate 37191 blctrl 3u IPv4 126660 0t0 UDP *:ca-2
caRepeate 37191 blctrl 5u IPv4 126990 0t0 UDP rockygu:33347
7、查明谁正在看什么文件和命令
以下示例显示用户
[blctrl@rockygu ~]$ lsof -i -u blctrl
8、列出所有网络连接
这个命令用"-i"选项显示所有网络连接'LISTENING & ESTABLISHED'的列表。
[blctrl@rockygu ~]$ lsof -i
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
caRepeate 37191 blctrl 3u IPv4 126660 0t0 UDP *:ca-2
caRepeate 37191 blctrl 5u IPv4 126990 0t0 UDP rockygu:33347
9、通告PID搜索
以下示例只显示其PID是1。
[root@rockygu blctrl]# lsof -p 1
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root cwd DIR 253,1 257 128 /
systemd 1 root rtd DIR 253,1 257 128 /
systemd 1 root txt REG 253,1 1601376 17117621 /usr/lib/systemd/systemd
systemd 1 root DEL REG 253,1 50332896 /usr/lib64/libm-2.28.so
systemd 1 root mem REG 253,1 637264 50956295 /usr/lib64/libudev.so.1.6.11
...
10、杀死特定用户的所有活动进程
列出特定用户运行的进程:
[blctrl@rockygu ~]$ lsof -t -u blctrl
214165
214177
214256
214257
有时你必须杀死一个特定用户的所有进程。以下命令将杀死blctrl用户的所有进程。
[root@rockygu blctrl]# kill -9 `lsof -t -u blctrl`
Remote side unexpectedly closed network connection
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Session stopped
- Press <return> to exit tab
- Press R to restart session
- Press S to save terminal output to file