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&lt;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的用法的主要内容,如果未能解决你的问题,请参考以下文章

lsof用法

lsof指令的用法

[转帖]linux lsof 用法简介

lsof 命令用法:查看已删除空间却没有释放的进程

linux常用命令杂记--Lsof

lsof命令