早上一个网站页面打开空白了,然后发现磁盘空满了,nginx的access.log占了170g多,于是通过rm删除了,然后重启nginx的问题还在。这时发现磁盘空没有释放。
[root@localhost logs]# du -h * 176Gaccess.log 0error.log 4.0Knginx.pid [root@localhost logs]# du -sh 176G. [root@localhost logs]# rm access.log [root@localhost logs]# df -Th 文件系统 类型 容量 已用 可用 已用% 挂载点 /dev/mapper/VolGroup00-LogVol00 ext3 189G 180G 0 100% / /dev/sda1 ext3 99M 13M 82M 13% /boot tmpfs tmpfs 2.0G 0 2.0G 0% /dev/shm [root@localhost logs]# du -sh 26M. [root@localhost logs]#这是令人沮丧的。很明显你删除了文件。为什么不在空之间发布?应该直接删除rm命令。已经在viewing/opt/nginx/dragons/display空之间发布。
du命令返回的值显示的是减去文件后的总大小
,df命令返回的值不显示减去文件后的大小(文件句柄仍在使用),直到运行的应用程序关闭打开的文件后才会释放([/k0/])。
不释放磁盘空原因:
在Linux或Unix系统中,通过rm或文件管理器删除文件将解除文件系统的目录结构的链接。但是,如果打开了一个文件(有一个进程在使用),该进程仍然可以读取该文件,并且磁盘空一直被占用。
此时,我才想起来我在rm之前检查了access.log,这不是重点。问题是我查完的时候用ctrl+c按C到Z,因为文件是175G,猫在后面会一直跑。
解决方案:
首先,获取已经被删除但仍被应用程序占用的文件列表。
[root@localhost logs]# lsof |grep deleted cat 4435 root 3r REG 8,3 184549376 399932 /opt/nginx/logs/access.log (deleted) [root@localhost logs]#从输出结果中我们可以看到/opt/nginx/logs/access.log还在使用,没有发布空,
怎么发布流程?
一种方法是杀死相应的进程,或者停止使用这个文件的应用程序,让os自动回收磁盘空。
当linux打开一个文件时,Linux内核会在/proc/〃/proc/nnnn/fd/directory(nnnn是pid)中为每个进程设置一个名为PID的目录,其子目录FD会保存该进程打开的所有文件的FD(fd(fd:filedescriptor)。
kill进程可以通过截断proc文件系统中的文件来强制系统回收分配给它的文件。这是一项高级技术,只有在管理员确定它不会影响正在运行的进程时才应该使用。应用程序不太支持这种方式,当正在使用的文件被截断时,可能会导致不可预知的问题。
我在这里直接使用了kill。
[root@localhost logs]# kill -9 4435 [root@localhost ~]# df -Th 文件系统 类型 容量 已用 可用 已用% 挂载点 /dev/mapper/VolGroup00-LogVol00 ext3 189G 3.4G 185G 2% / /dev/sda1 ext3 99M 13M 82M 13% /boot tmpfs tmpfs 2.0G 0 2.0G 0% /dev/shm [root@localhost ~]#查看disk空的使用情况,发现disk空已经被回收。
关于lsof命令
Lsof(列出打开的文件)是一个列出当前系统打开的文件的工具。在linux环境中,一切都以文件的形式存在,通过它你不仅可以访问常规数据,还可以访问网络连接和硬件。因此,如传输控制协议(TCP)和用户数据报协议(UDP)套接字,系统在后台为应用分配一个文件描述符。不管这个文件的性质如何,这个文件描述符为应用程序和基本 *** 作系统之间的交互提供了一个通用接口。因为应用程序的打开文件的描述符列表提供了关于应用程序本身的大量信息,所以能够通过lsof工具查看该列表对于系统监控和调试将非常有帮助。
[root@localhost ~]# lsof|more COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME init 1 root cwd DIR 8,3 4096 2 / init 1 root rtd DIR 8,3 4096 2 / init 1 root txt REG 8,3 149284 130607 /sbin/init
TYPE:文件类型,如DIR、REG等。
DEVICE:指定磁盘的名称
NODE:inode(文件在磁盘上的标识)
FD:文件描述符,应用程序可以通过它来标识文件。Cwd、txt等CWD值。
cwd值表示应用程序的当前工作目录,这是应用程序启动的目录,除非它自己更改这个目录。
TXT类型的文件是程序代码,比如应用程序二进制本身或者共享库,比如上面列表中显示的/sbin/init程序。其次,数值代表应用程序的文件描述符,是打开文件时返回的整数。上面的文件/dev/initctl的最后一行有一个文件描述符10。u表示文件以读/写模式打开,而不是只读或只写(W)模式。同时,大写的W表示应用程序对整个文件有写锁。这个文件描述符用于确保一次只能打开一个应用程序实例。当每个应用程序最初打开时,有三个文件描述符,从0到2,分别代表标准输入、输出和错误流。所以大部分应用打开的文件的FD都是从3开始的。
与FD列相比,Type列更直观。文件和目录分别称为REG和dir。CHR和BLK分别代表字符和块设备;或者UNIX、FIFO和IPv4,分别代表UNIX域套接字、FIFO队列和互联网协议(IP)套接字。
lsof参数:
-c<进程名称>:列出指定进程打开的文件
-g列出GID进程的详细信息
-d:列出占用此文件编号的进程
+d<目录>:列出目录中打开的文件
+d<目录>:列出递归目录中打开的文件
-n<目录>:使用NFS列出文件
-I<条件>:列出(4,6,protocol,:port,@IP)
-p<进程号>:列出指定进程号打开的文件
-u列出带有UID号的进程的详细信息
-h显示帮助信息
-v显示版本信息
-i用于显示合格的进程。
例如,检查端口22的当前 *** 作。
[root@localhost ~]# lsof -i :22 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 1568 root 3u IPv4 10443 0t0 TCP *:ssh (LISTEN)-a表示仅当两个参数都满足时才显示结果
Lsof输出信息:
命令:进程名称
PID:进程标识符
PPID:父进程标识符(需要指定-R参数)
用户:进程所有者
PGID:进程所属的组
FD:文件描述符,应用程序使用它来标识文件。比如cwd,txt等。
1)cwd:表示当前的工作目录,也就是应用程序当前的工作目录,也就是应用程序启动的目录,除非它自己改变了这个目录
2)txt:这种类型的文件就是程序代码,比如应用程序二进制文件本身或者共享库,如上面列表中的/sbin/init所示。
4)er:FD信息错误(见姓名栏);
5)jld:监狱目录(FreeBSD);
6)ltx:共享库文本(代码和数据);
7)mxx:十六进制内存映射类型号xx。
8)m86:DOS合并映射文件;
9)mem:内存映射文件;
10)mmap:内存映射设备;
11)pd:父目录;
12)rtd:根目录;
13)tr:内核跟踪文件(OpenBSD);
14)v86VP/ix映射文件;
15)0:表示标准输出
16)1:表示标准输入
17)2:表示标准误差
。一般标准输出、标准误差、标准输入后面都是文件状态模式:R、W、U等。
1)2)r:表示文件已打开且处于只读模式
3)w:表示文件已打开且处于
4)空网格中:表示文件的状态模式未知且未锁定
5)-表示文件的状态模式未知且已锁定。与相关锁
1)n:对于未知类型的SolarisNFS锁;
2)r:对文件的一部分进行读锁定;
3)R:对整个文件进行读锁定;
4)w:对文件的一部分进行写锁定;(文件的部分写锁)
5)W:针对整个文件的写锁;(整个文件的写锁)
6)U:针对任意长度的读写锁;
7)U:用于未知类型的锁;
8)x:用于SCOOpenServerXenix对部分文件的锁定;
9)X:针对整个文件的SCOOpenServerXenix锁;
10)空格:如果没有锁。
type:文件类型,如DIR、REG等。常见文件类型
1)DIR:表示目录
2)CHR:表示字符类型
3)BLK:块设备类型
4)UNIX:UNIX域套接字
5)FIFO:先进先出(FIFO)队列[6)IPv4:互联网协议(IP)套接字
设备:指定磁盘名称
大小:文件大小
节点:inode(标识
示例:检查谁在使用一个文件,即找到与一个文件相关的进程。
[root@ProxyServer ~]# lsof /var/log/messages COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME rsyslogd 1316 root 1w REG 8,3 9629155 9701151 /var/log/messages [root@ProxyServer ~]#示例:递归查看目录的文件信息
[root@ProxyServer ~]# lsof +D /var/log COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME auditd 1291 root 5w REG 8,3 3133843 9700134 /var/log/audit/audit.log rsyslogd 1316 root 1w REG 8,3 9629155 9701151 /var/log/messages使用+D,将列出相应目录中的所有子目录和文件。
示例:列出用户打开的文件信息
示例:列出除某个用户之外的已打开文件的信息。
[root@ProxyServer ~]# lsof -u ^zabbix |more示例:列出程序进程打开的文件的信息。
[root@ProxyServer ~]# lsof -c zabbix|more COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME zabbix_ag 1847 zabbix cwd DIR 8,3 4096 2 / zabbix_ag 1847 zabbix rtd DIR 8,3 4096 2 / zabbix_ag 1847 zabbix txt REG 8,3 837426 2888704 /usr/local/zabbix/sbin/zabbix_agentdc选项会列出所有以zabbix开头的程序的文件,但是也可以写成lsof|grepzabbix。
示例:列出用户和进程打开的文件的信息。
[root@ProxyServer ~]# lsof -u zabbix -c zabbix|more COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME zabbix_ag 1847 zabbix cwd DIR 8,3 4096 2 / zabbix_ag 1847 zabbix rtd DIR 8,3 4096 2 / zabbix_ag 1847 zabbix txt REG 8,3 837426 2888704 /usr/local/zabbix/sbin/zabbix_agentd示例:显示某个进程号要打开的文件。
[root@ProxyServer ~]# lsof -p 1825 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME nginx 1825 root cwd DIR 8,3 4096 2 / nginx 1825 root rtd DIR 8,3 4096 2 / nginx 1825 root txt REG 8,3 7555879 3806770 /opt/nginx/sbin/nginx列出对应于多个进程号的文件信息。
[root@ProxyServer~]#lsof-p1825,1826.1827
列出由除一个进程号以外的其他进程号打开的文件的信息。
[root@proxyserver~]#lsof-p^1825
列出所有网络连接:lsof-i
列出所有tcp网络连接信息:lsof-itcp
列出所有udp网络连接信息:lsof-iudp
列出正在使用特定端口的用户:lsof-i:3306
列出正在使用特定udp端口的用户:br/]特定tcp端口:lsof-itcp:80
列出用户的所有活动网络端口:lsof-a-utest-i
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)