0 前言
今天国产电脑提示磁盘空间已耗尽,使用用df命令检查文件系统情况,发现/dev/sda2已使用100%。
Linux shell编程学习笔记39:df命令https://blog.csdn.net/Purpleendurer/article/details/135577571于是开始清理磁盘空间。
第一步是查看已删除、但空间却没有释放的进程。
这里要用到 lsof命令。
1 lsof命令的安装
PurpleEndurer @ bash ~ $ lsof --help
bash: lsof: command not found
PurpleEndurer @ bash ~ $
lsof 命令默认是没有安装的,如果你的系统中没有安装这个命令,那么可以 使用以下命令安装:
yum install -y lsof
PurpleEndurer @ bash ~ $ yum install -y lsof
Loaded plugins: fastestmirror, ovl
ovl: Error while doing RPMdb copy-up:
[Errno 13] Permission denied: '/var/lib/rpm/Providename'
You need to be root to perform this command.
PurpleEndurer @ bash ~ $
2 lsof命令的功能、格式和选项说明
我们像往常输入lsof --help命令,想查看 lsof命令的帮助信息。
purpleEndurer @bash ~ $
lsof --help
lsof: illegal option character: -lsof: -e not followed by a file system path: "lp"
lsof 4.89
latest revision: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/
latest FAQ: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/FAQ
latest man page: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/lsof_man
usage: [-?abhKlnNoOPRtUvVX] [+|-c c] [+|-d s] [+D D] [+|-E] [+|-e s] [+|-f[gG]]
[-F [f]] [-g [s]] [-i [i]] [+|-L [l]] [+m [m]] [+|-M] [-o [o]] [-p s]
[+|-r [t]] [-s [p:s]] [-S [t]] [-T [t]] [-u s] [+|-w] [-x [fl]] [--] [names]
Defaults in parentheses; comma-separated set (s) items; dash-separated ranges.
-?|-h list help -a AND selections (OR) -b avoid kernel blocks
-c c cmd c ^c /c/[bix] +c w COMMAND width (9) +d s dir s files
-d s select by FD set +D D dir D tree SLOW? +|-e s exempt s RISKY
-i select IPv[46] files -K list tasKs (threads) -l list UID numbers
-n no host names -N select NFS files -o list file offset
-O no overhead RISKY -P no port names -R list paRent PID
-s list file size -t terse listing -T disable TCP/TPI info
-U select Unix socket -v list version info -V verbose search
+|-w Warnings (+) -X skip TCP&UDP* files -Z Z context [Z]
-- end option scan
-E display endpoint info +E display endpoint info and files
+f|-f +filesystem or -file names +|-f[gG] flaGs
-F [f] select fields; -F? for help
+|-L [l] list (+) suppress (-) link counts < l (0 = all; default = 0)
+m [m] use|create mount supplement
+|-M portMap registration (-) -o o o 0t offset digits (8)
-p s exclude(^)|select PIDs -S [t] t second stat timeout (15)
-T qs TCP/TPI Q,St (s) info
-g [s] exclude(^)|select and print process group IDs
-i i select by IPv[46] address: [46][proto][@host|addr][:svc_list|port_list]
+|-r [t[m<fmt>]] repeat every t seconds (15); + until no files, - forever.
An optional suffix to t is m<fmt>; m must separate t from <fmt> and <fmt> is an strftime(3) format for the marker line.
-s p:s exclude(^)|select protocol (p = TCP|UDP) states by name(s).
-u s exclude(^)|select login|UID set s
-x [fl] cross over +d|+D File systems or symbolic Links
names select named files or files on named file systems
Anyone can list all files; /dev warnings disabled; kernel ID check disabled.
purpleEndurer @bash ~ $
尽管 lsof命令不支持--help选项,但给出了帮助信息。
查看 lsof命令 帮助信息正确选项是 -? 或 -h。
2.1 命令功能
lsof 是 List Open File 的缩写, 主要功能是获取和显示被进程打开文件的信息。
2.2 命令格式
lsof [-?abhKlnNoOPRtUvVX] [+|-c c] [+|-d s] [+D D] [+|-E] [+|-e s] [+|-f[gG]]
[-F [f]] [-g [s]] [-i [i]] [+|-L [l]] [+m [m]] [+|-M] [-o [o]] [-p s]
[+|-r [t]] [-s [p:s]] [-S [t]] [-T [t]] [-u s] [+|-w] [-x [fl]] [--] [names]
2.3 选项说明
选项描述-h显示帮助信息-aAND选择(默认是或)-b避免内核块-c ccmd c ^c /c/[bix]+c w命令宽度(默认为9)+d s显示目录集合s下被打开的文件-d s通过文件描述符(FD)集合s来选择+D D递归处理所有子文件 慢?**+|-e s豁免 s 风险-E显示端点信息+E显示端点信息和文件+f|-f+文件系统或 -文件名+|-f[gG]flaGs-F [f]选择字段;-F?寻求帮助-g [s]排除(^)或选择并打印进程组ID-i 按 IPv[46] 地址选择:[46][proto][@host|addr][:svc_list|port_list]-K列出tasKs(线程)-l列出UID号+|-L [l]列表 (+) 抑制 (-) 链路计数 < l (0 = all; default = 0)+m [m]使用或创建安装补充+|-M端口映射注册 (-) -n没有主机名-N选择NFS文件列表-o列出文件偏移量 -o o o 0t 偏移位数(8)-O无开销 *风险**-p s排除(^)或选择PIDs -S [t] t秒统计超时(15)-P无端口名称-R列出paRent PID+-r [t[m<fmt>]]-s列表文件大小-s p:s排除(^)或选择protocol(p = TCP|UDP) 按名称表示。S [t]t 秒统计超时 (默认为15秒)-t简洁列表-T禁用TCP/TPI信息-TqsTCP/TPI Q,St(s)信息-u s排除(^)或 选择登录 或 UID集s-U选择Unix套接字-v显示版本信息-V详细搜索+|-w 警告-x [fl]跨越 +d|+D 文件系统或符号链接-X跳过TCP&UDP文件-Z Z上下文[Z]--结束选项扫描name选择命名文件或命名文件系统上的文件
- 括号中的是默认值
- 集合项使用逗号分隔
- 范围使用破折号分隔
3 使用实例
3.1 lsof : 显示当前所有活跃进程打开的所有文件
显示的内容很多,不好截图。
3.2 lsof | more:分页显示显示当前所有活跃进程打开的所有文件
我们可以使用管道操作符和more命令来分实现分页显示
purpleEndurer @bash / $ lsof | more
COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root cwd unknown /proc/1/cwd (
readlink: Permission denied)
systemd 1 root rtd unknown /proc/1/root
(readlink: Permission denied)
systemd 1 root txt unknown /proc/1/exe (
readlink: Permission denied)
systemd 1 root NOFD /proc/1/fd (o
pendir: Permission denied)
kthreadd 2 root cwd unknown /proc/2/cwd (
readlink: Permission denied)
kthreadd 2 root rtd unknown /proc/2/root
(readlink: Permission denied)
kthreadd 2 root txt unknown /proc/2/exe (
readlink: Permission denied)
kthreadd 2 root NOFD /proc/2/fd (o
pendir: Permission denied)
ksoftirqd 3 root cwd unknown /proc/3/cwd (
readlink: Permission denied)
ksoftirqd 3 root rtd unknown /proc/3/root
(readlink: Permission denied)
ksoftirqd 3 root txt unknown /proc/3/exe (
readlink: Permission denied)
ksoftirqd 3 root NOFD /proc/3/fd (o
pendir: Permission denied)
kworker/0 5 root cwd unknown /proc/5/cwd (
readlink: Permission denied)
kworker/0 5 root rtd unknown /proc/5/root
(readlink: Permission denied)
命令执行后返回的信息默认有10列,说明如下:
1.
COMMAND:进程名称
2.PID:进程ID
3.TID:线程ID
4.USER:所属用户
5.FD:文件描述符
可能的类型以及说明如下:
FD说明cwd当前目录txttxt文件rtdroot目录mem内存映射文件
6.
TYPE:
文件类型
可能的值以及说明如下:
TYPE说明DIR目录REG普通文件CHR字符a_inodeInode文件FIFO管道或者socket文件netlink网络unknown未知
7.
DEVICE:
设备ID
8.
SIZE/OFF:
进程大小
NODE:
文件的Inode号
NAME:
路径或者链接
后面备注(readlink: Permission denied),是因为当前用户相应的访问权限。
所以使用lsof命令最好有root权限或者赋予普通用于sudo权限。
3.3 lsof +d proc:显示当前目录下的proc目录中被打开的文件信息
purpleEndurer @bash / $ lsof +d proc | more
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 2641 gxxc 12r REG 0,4 0 4026531994 proc/swaps
lsof 12178 gxxc 3r DIR 0,4 0 1 proc
qaxbrowse 14744 gxxc 12r DIR 0,4 0 1 proc
qaxbrowse 14770 gxxc 19r DIR 0,4 0 1 proc
purpleEndurer @bash / $
3.4 lsof +d proc +l:显示当前目录下的proc目录中被打开的文件信息,其中USER列不显示用户名而显示UID
purpleEndurer @bash / $ lsof +d proc -l | more
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 2641 1000 12r REG 0,4 0 4026531994 proc/swaps
qaxbrowse 14744 1000 12r DIR 0,4 0 1 proc
qaxbrowse 14770 1000 19r DIR 0,4 0 1 proc
lsof 14916 1000 3r DIR 0,4 0 1 proc
purpleEndurer @bash / $
由于我们使用了 -l选项,所以执行结果中USER列显示的1000是UID
版权归原作者 紫郢剑侠 所有, 如有侵权,请联系我们删除。