Linux有个特性:一切皆文件。也就是说,很多的东西都通过文件的形式来访问和改变。
例如,系统加载的参数虽然在内存里,但文件系统(伪文件系统)中有一个文件接口,用于对参数的取值进行操作。
比如清空缓存的命令:
# echo 3 > /proc/sys/vm/drop_caches
lsof是一款非常常用的命令。如果你想删除一个历史遗留下来的大文件,但是又不确定这个文件是否是有用的,这时候就需要验证一下系统的进程是否在占用这个文件,这时候lsof就显现出它的作用。
# cd /var/log/
# lsof messages
如果显示出有进程占用,则说明文件被使用中,一般不能随意删除。
# lsof messages
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
rsyslogd 849 root 3w REG 253,1 576192 68323904 messages
常用参数
下面是常用的参数:
-a:列出打开文件存在的进程;
-c<进程名>:列出指定进程所打开的文件;
-g:列出GID号进程详情;
-d<文件号>:列出占用该文件号的进程;
+d<目录>:列出目录下被打开的文件;
+D<目录>:递归列出目录下被打开的文件;
-n<目录>:列出使用NFS的文件;
-i<条件>:列出符合条件的进程。(4、6、协议、:端口、 @ip )
-p<进程号>:列出指定进程号所打开的文件;
-u:列出UID号进程详情;
-h:显示帮助信息;
-v:显示版本信息。
里面常用地,应该是+D、+d、-i、-p、-u选项。
# lsof +D /var/log |egrep -v "^bask|^lsof|^egrep"
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
auditd 812 root 4w REG 253,1 608837 101539327 /var/log/audit/audit.log
tuned 847 root 3w REG 253,1 6354 101539326 /var/log/tuned/tuned.log
rsyslogd 849 root 3w REG 253,1 576192 68323904 /var/log/messages
rsyslogd 849 root 6w REG 253,1 7562 68323905 /var/log/secure
rsyslogd 849 root 7w REG 253,1 1840 68429834 /var/log/cron
rsyslogd 849 root 8w REG 253,1 792 68323906 /var/log/maillog
bash 2471 root cwd DIR 253,1 4096 67149966 /var/log
bash 2567 root cwd DIR 253,1 4096 67149966 /var/log
lsof恢复误删的被占用文件
[root@localhost log]# lsof messages
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
rsyslogd 849 root 3w REG 253,1 576192 68323904 messages
[root@localhost log]# rm messages
rm:是否删除普通文件 "messages"?y
[root@localhost log]# lsof |grep delete
rsyslogd 849 root 3w REG 253,1 576192 68323904 /var/log/messages (deleted)
in:imjour 849 859 root 3w REG 253,1 576192 68323904 /var/log/messages (deleted)
rs:main 849 861 root 3w REG 253,1 576192 68323904 /var/log/messages (deleted)
# 进程号是849
[root@localhost log]# cd /proc/849/fd/
[root@localhost fd]# ll
总用量 0
lr-x------. 1 root root 64 1月 16 07:21 0 -> /dev/null
l-wx------. 1 root root 64 1月 16 07:21 1 -> /dev/null
l-wx------. 1 root root 64 1月 16 07:21 2 -> /dev/null
l-wx------. 1 root root 64 1月 16 07:21 3 -> /var/log/messages (deleted) // 显示deleted,说明没有被完全删除,可以恢复。
[root@localhost fd]# cat 3 > /var/log/messages
[root@localhost fd]# cd /var/log/
[root@localhost log]# wc -l messages
6773 messages # 文件又回来了。
转载请注明:liutianfeng.com » lsof – Linux中常用的进程、文件占用查询命令(占用文件删除后的恢复)