如何查看进程句柄数LINUX单进程能够打开的最大文件句柄数

Linux系统超出文件句柄限制数量怎么办
如果您是网吧技术网管,并有权设置,那么建议您使用为您提供的优质主页:2345导航和SOSO主页.佣金高,不扣量,轻松赚外快!详细请咨询5636联盟24小时服务热线:400-001-5636
您也许还想了解:
  上一篇文章中我们向大家介绍了,相信大家肯定都有所了解了吧!接下来我们要继续给大家介绍一下Linux系统超出文件句柄限制数量怎么办,下面大家就跟着我们5636网吧联盟的栏目一起去看看吧!
  其实Linux是有文件句柄限制的,Linux系统超出文件句柄限制数量时一般发生在Linux下面部署应用的时候,会遇上Socket/File:Can&topensomanyfiles的问题,文件句柄限制数量默认不是很高,一般都是1024,作为一台生产服务器,很容易就达到这个数量,所以我们需要把这个值改大一些。
  我们可以用ulimit-a来查看所有限制值:openfiles(-n)1024这个就是限制数量的了。
  1、这个限制是针对单个程序的限制
  2、这个限制不会改变之前已经运行了的程序的限制
  3、对这个值的修改,退出了当前的shell就会消失
  如果需要改变整体的限制值或运行的程序是系统启动的,我们要怎么处理呢?其中一个方法就是想ulimit修改命令放入/etc/profile里面,但是这个做法并不好。正确的做法应该是修改/etc/security/limits.conf
  这个里面有很详细的注释,比如
  *softnofile2048
  *hardnofile32768
  就可以将文件句柄限制统一改成软2048,硬32768。硬限制是实际的限制,而软限制,是warnning限制,只会做出warning,其实ulimit命令本身就有分软硬设置,加-H就是硬,加-S就是软。
  默认显示的是软限制,如果修改的时候没有加上的话,就是两个一起改,配置文件最前面的一位是domain,设置为星号代表全局,另外你也可以针对不同的用户做出不同的限制
  修改了,重新登录用ulimit一开就立刻生效了,不过之前启动过的程序要重新启动才能使用新的值。我用的是CentOS,似乎有些系统需要重启才能生效。
  ulimit其实就是对单一程序的限制,系统总限制其实是/proc/sys/fs/file-max。我们可以通过cat查看目前的值,echo来立刻修改,此外还有一个,/proc/sys/fs/file-nr。只读,可以看到整个系统目前使用的文件句柄数量。
  大家在查找文件句柄问题的时候,还有一个很实用的程序lsof,可以很方便看到某个进程开了那些句柄,也可以看到某个文件/目录被什么进程占用了。
  Linux系统超出文件句柄限制数量怎么办的问题我们就说到这里了,大家如果还有不明白的地方可以去本站的网吧系统栏目去查找,如果找不到解决办法,可以留言一起讨论,当然如果大家有什么好的资料也可以和我们一起分享哦!
本文地址:
5636网吧问答――为您解决一切网吧难题
5636网吧问答为您解决网吧行业各种经营管理与技术难题,欢迎向我们提出您未能解决的网吧疑问,5636网吧专家将在12小时内为您认真解答,谢谢支持!
所属网站:5636网吧增值联盟
本文未能解决您的问题,请向5636网吧专家提问
网吧增值主页
hao123主页
增值类型:主页
所属公司:百度
计费方式:18元 / 1000次UV
搜狗导航主页
增值类型:主页
所属公司:搜狗
计费方式:25元 / 1000次UV
增值类型:桌标
所属公司:5636联盟
计费方式:600元/1000终端/月
增值类型:退弹
所属公司:5636联盟
计费方式:540元/1000终端/月
<span style="color:#16-04-21
<span style="color:#16-04-21
<span style="color:#16-04-21
<span style="color:#16-04-21
<span style="color:#16-04-20
<span style="color:#16-04-20
<span style="color:#16-04-19
<span style="color:#16-04-19
<span style="color:#16-04-18
<span style="color:#16-04-18
<span style="color:#16-04-15
<span style="color:#16-04-15电脑教程子分类&&&&linux的最大进程句柄数设置
linux的最大进程句柄数设置
linux的最大进程句柄数设置在Linux下,我们使用ulimit -n命令可以看到单个进程能够打开的最大文件句柄数量(socket连接也算在里面)。系统默认值1024。
嵌到我的页面
<input type="text" readonly="true" value="">
若举报审核通过,可奖励20下载分
被举报人:
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:
VIP下载&&免积分60元/年(1200次)
您可能还需要
操作系统下载排行5477人阅读
操作系统(8)
进程文件句柄管理
lsof -n | awk '{print $2}' | sort | uniq -c | sort -nr | more
查看统计,每个进程占用多少个文件句柄,数量太多,会导致系统崩溃
第一列句柄数,第二列进程号
可以通过ulimit -a 查看进程数限制
vi /etc/security/limits.conf修改最大限制
======================================================================================
lsof(list open files)是一个列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。
在终端下输入lsof即可显示系统打开的文件,因为 lsof 需要访问核心内存和各种文件,所以必须以 root 用户的身份运行它才能够充分地发挥其功能。
COMMAND&&& PID&&&&& USER&& FD&&&&& TYPE&&&& DEVICE&&&& SIZE&&&&&& NODE&&&&& NAME
init&&&&&& 1&&&&&&&& root& cwd&&&&& DIR&&&&&& 3,3&&&&&& 1024&&&&&& 2&&&&&&&& /
init&&&&&& 1&&&&&&&& root& rtd&&&&& DIR&&&&&& 3,3&&&&&& 1024&&&&&& 2&&&&&&&& /
init&&&&&& 1&&&&&&&& root& txt&&&&& REG&&&&&& 3,3&&&&&& 38432&&&&& 1763452& /sbin/init
init&&&&&& 1&&&&&&&& root& mem&&&&& REG&&&&&& 3,3&&&&&& 106114&&&& 1091620& /lib/libdl-2.6.so
init&&&&&& 1&&&&&&&& root& mem&&&&& REG&&&&&& 3,3&&&&&& 7560696&&& 1091614& /lib/libc-2.6.so
init&&&&&& 1&&&&&&&& root& mem&&&&& REG&&&&&& 3,3&&&&&& 79460&&&&& 1091669& /lib/libselinux.so.1
init&&&&&& 1&&&&&&&& root& mem&&&&& REG&&&&&& 3,3&&&&&& 223280&&&& 1091668& /lib/libsepol.so.1
init&&&&&& 1&&&&&&&& root& mem&&&&& REG&&&&&& 3,3&&&&&& 564136&&&& 1091607& /lib/ld-2.6.so
init&&&&&& 1&&&&&&&& root& 10u&&&&& FIFO&&&&& 0,15&&&&&&&&&&&&&&&&& 1309&&&& /dev/initctl
每行显示一个打开的文件,若不指定条件默认将显示所有进程打开的所有文件。lsof输出各列信息的意义如下:
COMMAND:进程的名称
PID:进程标识符
USER:进程所有者
FD:文件描述符,应用程序通过文件描述符识别该文件。如cwd、txt等
TYPE:文件类型,如DIR、REG等
DEVICE:指定磁盘的名称
SIZE:文件的大小
NODE:索引节点(文件在磁盘上的标识)
NAME:打开文件的确切名称
其中FD 列中的文件描述符cwd &#20540;表示应用程序的当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改。txt 类型的文件是程序代码,如应用程序二进制文件本身或共享库,如上列表中显示的 /sbin/init 程序。其次数&#20540;表示应用程序的文件描述符,这是打开该文件时返回的一个整数。如上的最后一行文件/dev/initctl,其文件描述符为10。u 表示该文件被打开并处于读取/写入模式,而不是只读 (R) 或只写 (w) 模式。同时还有大写 的W 表示该应用程序具有对整个文件的写锁。该文件描述符用于确保每次只能打开一个应用程序实例。初始打开每个应用程序时,都具有三个文件描述符,从
0 到 2,分别表示标准输入、输出和错误流。所以大多数应用程序所打开的文件的 FD 都是从 3 开始。与 FD 列相比,Type 列则比较直观。文件和目录分别称为 REG 和 DIR。而CHR 和 BLK,分别表示字符和块设备;或者 UNIX、FIFO 和 IPv4,分别表示 UNIX 域套接字、先进先出 (FIFO) 队列和网际协议 (IP) 套接字。
lsof 常见的用法是查找应用程序打开的文件的名称和数目。可用于查找出某个特定应用程序将日志数据记录到何处,或者正在跟踪某个问题。例如,linux限制了进程能够打开文件的数目。通常这个数&#20540;很大,所以不会产生问题,并且在需要时,应用程序可以请求更大的&#20540;(直到某个上限)。如果你怀疑应用程序耗尽了文件描述符,那么可以使用 lsof 统计打开的文件数目,以进行验证。lsof语法&#26684;式是:
01.lsof [options] filename
复制代码常用的参数列表:
lsof& filename 显示打开指定文件的所有进程
lsof -a 表示两个参数都必须满足时才显示结果
lsof -c string&& 显示COMMAND列中包含指定字符的进程所有打开的文件
lsof -u username& 显示所属user进程打开的文件
lsof -g gid 显示归属gid的进程情况
lsof &#43;d /DIR/ 显示目录下被进程打开的文件
lsof &#43;D /DIR/ 同上,但是会搜索目录下的所有目录,时间相对较长
lsof -d FD 显示指定文件描述符的进程
lsof -n 不将IP转换为hostname,缺省是不加上-n参数
lsof -i 用以显示符合条件的进程情况
lsof -i[46] [protocol][@hostname|hostaddr][:service|port]
&&&&&&&&&&& 46 --& IPv4 or IPv6
&&&&&&&&&&& protocol --& TCP or UDP
&&&&&&&&&&& hostname --& Internet host name
&&&&&&&&&&& hostaddr --& IPv4地址
&&&&&&&&&&& service --& /etc/service中的 service name (可以不只一个)
&&&&&&&&&&& port --& 端口号 (可以不只一个)
例如: 查看22端口现在运行的情况
01.# lsof -i :22
02.COMMAND& PID USER&& FD&& TYPE DEVICE SIZE NODE NAME
03.sshd&&& 1409 root&&& 3u& IPv6&& 5678&&&&&& TCP *:ssh (LISTEN)
复制代码查看所属root用户进程所打开的文件类型为txt的文件:
01.# lsof -a -u root -d txt
02.COMMAND&&& PID USER& FD&&&&& TYPE DEVICE&&& SIZE&&& NODE NAME
03.init&&&&&& 1&&& root txt&&&&&& REG&&& 3,3&& 2 /sbin/init
04.mingetty& 1632 root txt&&&&&& REG&&& 3,3&& 7 /sbin/mingetty
05.mingetty& 1633 root txt&&&&&& REG&&& 3,3&& 7 /sbin/mingetty
06.mingetty& 1634 root txt&&&&&& REG&&& 3,3&& 7 /sbin/mingetty
07.mingetty& 1635 root txt&&&&&& REG&&& 3,3&& 7 /sbin/mingetty
08.mingetty& 1636 root txt&&&&&& REG&&& 3,3&& 7 /sbin/mingetty
09.mingetty& 1637 root txt&&&&&& REG&&& 3,3&& 7 /sbin/mingetty
10.kdm&&&&&&& 1638 root txt&&&&&& REG&&& 3,3& 8194 /usr/bin/kdm
11.X&&&&&&&&& 1670 root txt&&&&&& REG&&& 3,3 8336 /usr/bin/Xorg
12.kdm&&&&&&& 1671 root txt&&&&&& REG&&& 3,3& 8194 /usr/bin/kdm
13.startkde& 2427 root txt&&&&&& REG&&& 3,3& 4195 /bin/bash
14.... ... &
复制代码lsof使用实例
一、查找谁在使用文件系统
在卸载文件系统时,如果该文件系统中有任何打开的文件,操作通常将会失败。那么通过lsof可以找出那些进程在使用当前要卸载的文件系统,如下:
01.# lsof& /GTES11/
02.COMMAND& PID USER&& FD&& TYPE DEVICE SIZE NODE NAME
03.bash&&& 4208 root& cwd&&& DIR&&& 3,1 4096&&& 2 /GTES11/
04.vim&&&& 4230 root& cwd&&& DIR&&& 3,1 4096&&& 2 /GTES11/
复制代码在这个示例中,用户root正在其/GTES11目录中进行一些操作。一个 bash是实例正在运行,并且它当前的目录为/GTES11,另一个则显示的是vim正在编辑/GTES11下的文件。要成功地卸载/GTES11,应该在通知用户以确保情况正常之后,中止这些进程。 这个示例说明了应用程序的当前工作目录非常重要,因为它仍保持着文件资源,并且可以防止文件系统被卸载。这就是为什么大部分守护进程(后台进程)将它们的目录更改为根目录、或服务特定的目录(如 sendmail 示例中的 /var/spool/mqueue)的原因,以避免该守护进程阻止卸载不相关的文件系统。
二、恢复删除的文件
当Linux计算机受到入侵时,常见的情况是日志文件被删除,以掩盖攻击者的踪迹。管理错误也可能导致意外删除重要的文件,比如在清理旧日志时,意外地删除了数据库的活动事务日志。有时可以通过lsof来恢复这些文件。
当进程打开了某个文件时,只要该进程保持打开该文件,即使将其删除,它依然存在于磁盘中。这意味着,进程并不知道文件已经被删除,它仍然可以向打开该文件时提供给它的文件描述符进行读取和写入。除了该进程之外,这个文件是不可见的,因为已经删除了其相应的目录索引节点。
在/proc 目录下,其中包含了反映内核和进程树的各种文件。/proc目录挂载的是在内存中所映射的一块区域,所以这些文件和目录并不存在于磁盘中,因此当我们对这些文件进行读取和写入时,实际上是在从内存中获取相关信息。大多数与 lsof 相关的信息都存储于以进程的 PID 命名的目录中,即 /proc/1234 中包含的是 PID 为 1234 的进程的信息。每个进程目录中存在着各种文件,它们可以使得应用程序简单地了解进程的内存空间、文件描述符列表、指向磁盘上的文件的符号链接和其他系统信息。lsof 程序使用该信息和其他关于内核内部状态的信息来产生其输出。所以lsof
可以显示进程的文件描述符和相关的文件名等信息。也就是我们通过访问进程的文件描述符可以找到该文件的相关信息。
当系统中的某个文件被意外地删除了,只要这个时候系统中还有进程正在访问该文件,那么我们就可以通过lsof从/proc目录下恢复该文件的内容。 假如由于误操作将/var/log/messages文件删除掉了,那么这时要将/var/log/messages文件恢复的方法如下:
首先使用lsof来查看当前是否有进程打开/var/logmessages文件,如下:
01.# lsof |grep /var/log/messages
02.syslogd&& 1283&&&&& root&&& 2w&&&&& REG&&&&&&& 3,3& 5381017&&& 1773647 /var/log/messages (deleted)
复制代码从上面的信息可以看到 PID 1283(syslogd)打开文件的文件描述符为 2。同时还可以看到/var/log/messages已经标记被删除了。因此我们可以在 /proc/1283/fd/2 (fd下的每个以数字命名的文件表示进程对应的文件描述符)中查看相应的信息,如下:
# head -n 10 /proc/1283/fd/2
Aug& 4 13:50:15 holmes86 syslogd 1.4.1: restart.
Aug& 4 13:50:15 holmes86 kernel: klogd 1.4.1, log source = /proc/kmsg started.
Aug& 4 13:50:15 holmes86 kernel: Linux version 2.6.22.1-8 (root@everestbuilder.linux-ren.org) (gcc version 4.2.0) #1 SMP Wed Jul 18 11:18:32 EDT 2007
Aug& 4 13:50:15 holmes86 kernel: BIOS-provided physical RAM map:
Aug& 4 13:50:15 holmes86 kernel:& BIOS-e820: 0000 - f000 (usable)
Aug& 4 13:50:15 holmes86 kernel:& BIOS-e820: f000 - a0000 (reserved)
Aug& 4 13:50:15 holmes86 kernel:& BIOS-e820: 0000 - d3800 (usable)
Aug& 4 13:50:15 holmes86 kernel:& BIOS-e820: d3800 - 0000 (reserved)
Aug& 4 13:50:15 holmes86 kernel:& BIOS-e820: 0000 - 7000 (reserved)
Aug& 4 13:50:15 holmes86 kernel:& BIOS-e820: 8000 - c000 (reserved)
从上面的信息可以看出,查看 /proc/8663/fd/15 就可以得到所要恢复的数据。如果可以通过文件描述符查看相应的数据,那么就可以使用 I/O 重定向将其复制到文件中,如:
01.cat /proc/1283/fd/2 & /var/log/messages
复制代码对于许多应用程序,尤其是日志文件和数据库,这种恢复删除文件的方法非常有用。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:160359次
积分:2257
积分:2257
排名:第10835名
原创:54篇
转载:28篇
评论:35条
(1)(14)(1)(1)(1)(2)(1)(2)(3)(2)(1)(1)(3)(1)(2)(4)(1)(2)(2)(4)(1)(1)(2)(1)(1)(3)(4)(4)(1)(6)(2)(4)(4)转:linux下查看系统进程占用的句柄数
---查看系统默认的最大文件句柄数,系统默认是1024
# ulimit -n
----查看当前进程打开了多少句柄数
# lsof -n|awk '{print $2}'|sort|uniq
-c|sort -nr|more
131 24204 
57 24244  
57 24231   ........
其中第一列是打开的句柄数,第二列是进程ID。
可以根据ID号来查看进程名。
# ps aef|grep 24204
nginx   99 16:15 ?    00:24:25
/usr/local/nginx/sbin/nginx -s
myivr出现core文件,发现在写录音文件的时候出问题。具体原因还不清楚,暂时认定为超过了单个进程打开的最大句柄数(默认值为1024)。
16:50 myivr
&#lsof -p&3226
用这个命令查看进程3226打开的文件信息,发现所有的转换wav文件都没有关闭。
确认是这个问题,在729ToWav函数中只关闭了729文件,没有关闭wav文件。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。}

我要回帖

更多关于 linux 查看进程句柄 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信