lsof – Linux中常用的进程、文件占用查询命令(占用文件删除后的恢复)

系统+安全 Liemer_Lius 1249℃

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中常用的进程、文件占用查询命令(占用文件删除后的恢复)

喜欢 (2)

评论已关闭。