markdown lsof的用法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了markdown lsof的用法相关的知识,希望对你有一定的参考价值。
# lsof用法
显示打开的文件 或可通过此命令来查打开的文件句柄数
通过该命令,可以搜索到任何能够在文件系统中通过路径选择到的文件
## 用法
```
lsof
[ -?abChlnNOPRtUvVX ]
[ -A A ]
[ -c c ]
[ +c c ]
[ +|-d d ]
[ +|-D D ]
[ +|-e s ]
[ +|-f [cfgGn] ]
[ -F [f] ]
[ -g [s] ]
[ -i [i] ]
[ -k k ]
[ +|-L [l] ]
[ +|-m m ]
[ +|-M ]
[ -o [o] ]
[ -p s ]
[ +|-r [t[m<fmt>]] ]
[ -s [p:s] ]
[ -S [t] ]
[ -T [t] ]
[ -u s ]
[ +|-w ]
[ -x [fl] ]
[ -z [z] ]
[ -Z [Z] ]
[ -- ]
[names]
```
## 选项说明(仅列出常用的)
特殊符合说明:
* `^`表示排除
### -a
默认的,多个选项之间是 或 的关系。使用该选项后,则变成 与 的关系
需要注意的是,有些选项支持多个值如`-uaaa,bbb`(用户是aaa或bbb)和多个相同选项组成的,
如`-i@aaa.bbb, -i@ccc.ddd`,表示一个集合的选项,集合内的还是或的关系
### -c cmd
显示命令相关的文件信息。如 `-c bash`
如果需要指定多个命令,可使用多个`-c`参数
当 cmd 的起始和结束位置都是/时,则被认为是正则表达式,结束/后面可再加修饰符来声明正则的模式
* `b`表示正则基础模式。如`-c /test/b`
* `i`表示大小写不敏感模式。如`-c /test/i`
* `x`表示正则扩展模式,是默认的。如`-c /test/x`
### +c width
显示的命令的长度,默认长度为9。每个操作系统有可能会限制显示的命令长度
当 width为0时,则表示不限制,以操作系统能显示的长度为准
### +d dir
显示指定文件夹自身及其下文件和子文件夹(不递归)被打开的情况
dir不可为软连接,除非也指定了`-x`或`-x l`参数
### +D dir
显示指定文件夹自身及其下文件和子文件夹(递归)被打开的情况
dir不可为软连接,除非也指定了`-x`或`-x l`参数
注意:如果被引用较多,可能会比较耗内存
### -d fd
显示指定文件描述符的打开情况。支持多选`-d 1,cwd`,范围`-d 1-100`,非`-d ^100`
### -F x
用于指定只输出哪个列的信息,通常是通过管道给其他程序使用。
输出的信息中,首个字符代表字段类型,后面的才是这个字段的值,如
```
sudo lsof -ucqc -Fp | head
p1873
p3080
p15308
p15309
p19177
p19178
p23608
```
可同时指定多个字段,默认每个字段间是以换行号为分隔的,可通过加`0`来使用NUL(000)来
```
sudo lsof -ucqc -F pc0 | awk -F '\000' '{print $1" "$2}'
p1873 cpv
p3309 cawk
p15308 csshd
p15309 cbash
p19177 csshd
p19178 cbash
p23608 csshd
```
可输出的字段类型有:
- `a` file access mode
- `c` process command name (all characters from proc or user structure)
- `C` file structure share count
- `d` file’s device character code
- `D` file’s major/minor device number (0x<hexadecimal>)
- `f` file descriptor
- `F` file structure address (0x<hexadecimal>)
- `G` file flaGs (0x<hexadecimal>; names if +fg follows)
- `i` file’s inode number
- `k` link count
- `l` file’s lock status
- `L` process login name
- `m` marker between repeated output
- `n` file name, comment, Internet address
- `N` node identifier (ox<hexadecimal>
- `o` file’s offset (decimal)
- `p` process ID (always selected)
- `g` process group ID
- `P` protocol name
- `r` raw device number (0x<hexadecimal>)
- `R` parent process ID
- `s` file’s size (decimal)
- `S` file’s stream identification
- `t` file’s type
- `T` TCP/TPI information, identified by prefixes (the‘=’ is part of the prefix):
- QR=<read queue size>
- QS=<send queue size>
- SO=<socket options and values> (not all dialects)
- SS=<socket states> (not all dialects)
- ST=<connection state>
- TF=<TCP flags and values> (not all dialects)
- WR=<window read size> (not all dialects)
- WW=<window write size> (not all dialects)
(TCP/TPI information isn’t reported for all supported UNIX dialects. The -h or -? help output for the -T option will show what TCP/TPI reporting can be requested.)
- `u` process user ID
- `z` Solaris 10 and higher zone name
- `Z` SELinux security context (inhibited when SELinux is disabled)
- `0` use NUL field terminator character in place of NL
- `1-9` dialect-specific field identifiers (The output of -F? identifies the information to be found in dialect-specific fields.)
### -i [i]
列出网络连接。`[i]`可以是网络地址的任意一个部分
网络地址的组成为:`[46][protocol][@hostname|hostaddr][:service|port]`
* `46`表示IP协议版本。如`-i4`、`-i6`
* `protocol`表示协议名称,有`TCP`、`UDP`。如`-iTCP`,`-iUDP`
* `hostname`表示域名。如`-i@node1`
* `hostaddr`表示ip地址。如`-i@127.0.0.1`
* `service`是一个`/etc/services`中的名称,如`ftp`(每个服务名称有其默认的端口)。如`-i:ftp`
* `port`端口。如`-i:22`
可以组合查询,如:`-iTCP:25`、`-iTCP@lsof.itap:513`、`-i:10-20,ftp,80`
### -l
让USER列显示为数字
### -n
对于网络连接,以ip而非host的形式展示。
### -N
展示被打开的NFS
### -p pid
显示和符合进程条件相关的信息。可指定多个进程编号,如`-p123,456`、`-p^456`
### -P
将端口显示为数字而非service形式
### +|- r [t[m<fmt>]]
重复执行`lsof`。
`+`表示当显示的文件为0时就自动停止
`-`表示无限重复,直到收到退出信号或中断
`t`表示时间间隔,单位为秒。默认为15分钟
`m<fmt>`为两次打印的分割符,默认为`========`
### -R
显示父进程的ID,PPID
### -s [protocol:state]
若仅单独指定`-s`,则输出项中的`SIZE/OFF`(文件大小或偏移量)则切换为`SIZE`,若文件无`SIZE`,则不显示
若指定了`protocol` (有`TCP`和`UDP`)和`stat`(连接状态)时,`stat`允许多个以逗号隔开,若是排除则用`^`开头,
如`-sTCP:LISTEN,ESTABLISHED`。
在未加`-i`参数时仅会把网络相关的按协议和状态进行过滤而其他类型的则还会正常输出
```
[cqc@emr-header-1 ~]$ sudo lsof -sTCP:LISTEN | head
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
init 1 root cwd DIR 253,0 4096 2 /
init 1 root rtd DIR 253,0 4096 2 /
init 1 root txt REG 253,0 150352 2883594 /sbin/init
init 1 root mem REG 253,0 65960 3407901 /lib64/libnss_files-2.12.so
init 1 root mem REG 253,0 1923352 3407885 /lib64/libc-2.12.so
init 1 root mem REG 253,0 90880 3408273 /lib64/libgcc_s-4.4.7-20120601.so.1
init 1 root mem REG 253,0 43944 3407913 /lib64/librt-2.12.so
init 1 root mem REG 253,0 142688 3407909 /lib64/libpthread-2.12.so
init 1 root mem REG 253,0 265728 3407963 /lib64/libdbus-1.so.3.4.0
```
### -t
仅输出pid
常通过管道给下一级程序使用
### -u uid|username
按`uid`或`username`进行过滤,支持多选、排除(^)
### -U
显示socket file
### -v
显示`lsof`版本
### -x [fl]
常和`+d` `+D`一同使用,表示当是软连接或是挂载点时,能继续扫描。
`f`表示对挂载点继续扫描
`l`表示对软连接继续扫描
### -X
跳过输出网络信息(TCP, UDP and UDPLITE files)
## 输出列
* `COMMAND` 执行的命令。默认只输出命令的前9个字符,若需调整,需加上`-w`参数
* `PID` 进程编号
* `PPID` 父进程编号
* `PGID` 进程组编号。 需指定`-g`参数
* `USER` 用户名称或用户ID, 若指定`-l`则显示用户ID
* `FD` 文件描述符。其类型有
- `cwd` current working directory;
- `Lnn` library references (AIX);
- `err` FD information error (see NAME column);
- `jld` jail directory (FreeBSD);
- `ltx` shared library text (code and data);
- `Mxx` hex memory-mapped type number xx.
- `m86` DOS Merge mapped file;
- `mem` memory-mapped file;
- `mmap` memory-mapped device;
- `pd` parent directory;
- `rtd` root directory;
- `tr` kernel trace file (OpenBSD);
- `txt` program text (code and data);
- `v86` VP/ix mapped file;
在文件描述符后面会有以下几种状态
- `r` 表示在读
- `w` 表示在写
- `u` 表示在读写
- `空格` 表示状态未知且未被锁
- `-` 表示状态未知且被锁。
当有锁时,有以下几种类型
- `N` for a Solaris NFS lock of unknown type;
- `r` for read lock on part of the file;
- `R` for a read lock on the entire file;
- `w` for a write lock on part of the file;
- `W` for a write lock on the entire file;
- `u` for a read and write lock of any length;
- `U` for a lock of unknown type;
- `x` for an SCO OpenServer Xenix lock on part of the file;
- `X` for an SCO OpenServer Xenix lock on the entire file;
* `TYPE` 文件类型。以下为部分类型,其他查手册:
- `sock` for a socket of unknown domain;
- `unix` for a UNIX domain socket;
- `CHR` for a character special file;
- `DIR` for a directory
- `inet` for an Internet domain socket;
- `BLK` for a block special file;
- `REG` for a regular file;
- `FIFO` 管道
* `DEVICE` contains the device numbers, separated by commas(不明白)
* `SIZE` `SIZE/OFF` `OFFSET` 文件大小或偏移量或缓存大小
* `NDOE` 若是普通文件则是`inode`,若是网络连接则是`TCP`或`UDP`,若是流则是`STR`
* `NAME` 文件名称或连接名称
## 实践
### 查看端口被哪个进程占用
```
sudo lsof -i:10000
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
hue 12827 hue 14u IPv4 1125872310 0t0 TCP emr-header-1:36848->emr-header-1:ndmp (ESTABLISHED)
hue 12827 hue 16u IPv4 277152416 0t0 TCP emr-header-1:56944->emr-header-1:ndmp (CLOSE_WAIT)
java 22749 hadoop 585u IPv4 1125872311 0t0 TCP emr-header-1:ndmp->emr-header-1:36848 (ESTABLISHED)
java 22749 hadoop 598u IPv4 1085340809 0t0 TCP *:ndmp (LISTEN)
```
### 查看某个命令都打开了哪些文件
```
sudo lsof -c loop_etl.sh
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
loop_etl. 15797 user1 cwd DIR 253,16 4096 24379531 /mnt/disk1/user1/program/user1
loop_etl. 15797 user1 rtd DIR 253,1 4096 2 /
loop_etl. 15797 user1 txt REG 253,1 960608 1050319 /usr/bin/bash
loop_etl. 15797 user1 mem REG 253,1 106070960 1050292 /usr/lib/locale/locale-archive
loop_etl. 15797 user1 mem REG 253,1 2127336 1049989 /usr/lib64/libc-2.17.so
loop_etl. 15797 user1 mem REG 253,1 19776 1049995 /usr/lib64/libdl-2.17.so
loop_etl. 15797 user1 mem REG 253,1 174576 1050317 /usr/lib64/libtinfo.so.5.9
loop_etl. 15797 user1 mem REG 253,1 164264 1049982 /usr/lib64/ld-2.17.so
loop_etl. 15797 user1 mem REG 253,1 26254 1050291 /usr/lib64/gconv/gconv-modules.cache
loop_etl. 15797 user1 0u CHR 136,0 0t0 3 /dev/pts/0
loop_etl. 15797 user1 1w REG 253,16 59074 24384708 /mnt/disk1/user1/program/user1/20180126.log
loop_etl. 15797 user1 2w REG 253,16 59074 24384708 /mnt/disk1/user1/program/user1/20180126.log
loop_etl. 15797 user1 255r REG 253,16 982 24384704 /mnt/disk1/user1/program/user1/loop_etl.sh
sudo lsof -i -sTCP:LISTEN | head
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 1643 root 3u IPv4 10723 0t0 TCP *:ssh (LISTEN)
sshd 1643 root 4u IPv6 10725 0t0 TCP *:ssh (LISTEN)
mysqld 1797 mysql 10u IPv4 11715 0t0 TCP *:mysql (LISTEN)
master 1893 root 12u IPv4 11926 0t0 TCP localhost:smtp (LISTEN)
master 1893 root 13u IPv6 11928 0t0 TCP localhost:smtp (LISTEN)
java 2890 root 23u IPv6 1028084953 0t0 TCP *:distinct (LISTEN)
java 4301 root 24u IPv6 343194 0t0 TCP *:36671 (LISTEN)
java 4301 root 29u IPv6 343201 0t0 TCP *:eforward (LISTEN)
java 4301 root 31u IPv6 343202 0t0 TCP emr-header-1:ciphire-serv (LISTEN)
```
tcp的state有:CLOSED, IDLE, BOUND, LISTEN, ESTABLISHED, SYN_SENT, SYN_RCDV, CLOSE_WAIT, FIN_WAIT1, CLOSING, LAST_ACK, FIN_WAIT_2, and TIME_WAIT
udp的satae有:Unbound, Idle
**很多类型并没有size,如sockets, FIFOs, pipes, lsof可能(看操作系统)会显示成内核的缓存大小**
### 查看进程都打开了哪些文件
```
sudo lsof -p 15309
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 15309 cqc cwd DIR 253,3 4096 7995393 /home/cqc
bash 15309 cqc rtd DIR 253,0 4096 2 /
bash 15309 cqc txt REG 253,0 906248 3538956 /bin/bash
bash 15309 cqc mem REG 253,0 99160384 789715 /usr/lib/locale/locale-archive
bash 15309 cqc mem REG 253,0 65960 3407901 /lib64/libnss_files-2.12.so
bash 15309 cqc mem REG 253,0 1923352 3407885 /lib64/libc-2.12.so
bash 15309 cqc mem REG 253,0 19536 3407891 /lib64/libdl-2.12.so
bash 15309 cqc mem REG 253,0 132408 3407927 /lib64/libtinfo.so.5.7
bash 15309 cqc mem REG 253,0 154664 3407875 /lib64/ld-2.12.so
bash 15309 cqc mem REG 253,0 26060 787287 /usr/lib64/gconv/gconv-modules.cache
bash 15309 cqc 0u CHR 136,1 0t0 4 /dev/pts/1
bash 15309 cqc 1u CHR 136,1 0t0 4 /dev/pts/1
bash 15309 cqc 2u CHR 136,1 0t0 4 /dev/pts/1
bash 15309 cqc 255u CHR 136,1 0t0 4 /dev/pts/1
```
### 将和哪些文件相关的进程杀掉
```
kill `lsof -t xxxx.jar`
```
以上是关于markdown lsof的用法的主要内容,如果未能解决你的问题,请参考以下文章