文件打开过多(Too many open files)下

在“文件打开过多(Too many open files)上”一文中提到,通过修改limit.conf文件可以对最大文件修改数起到做用等等操作。但在实际操作中在通过ssh登录经过ulimit –n查询出来的最大文件却不是limit.conf的值。为此,继续追查到底怎么回事。

1、limit.conf这个文件到底是怎么文件,这个文件到底如何起作用?

通过对Linux的一些学习,原来limit.conf配置文件是Linux PAM(插入式认证模块,Pluggable Authentication Modules)中 pam_limits.so 的配置文件。

2、什么是PAM?

在这借百度知道网络通俗答复:简单地说,PAM主要是由一组共享库文件(也就是后缀名为.so文件)和一些配置文件组成的用于系统服务授权的一套东西,其中,PAM 就是 Pluggable Authentication Modules 这几个英文单词的缩写。当你在请求服务的时候,具有PAM认证功能的应用程序将与这些.so文件进行交互,以便得知是否可以授权给发起请求的用户来使用服务,比如su, vsftp, httpd,等。如果认证成功了,那么这个用户便可以使用服务或完成命令,如果认证失败了,那么这个用户将不能使用服务,同时,PAM将向指定的log文件写入警告信息。我们可以将PAM看作是一个中间裁判,它不依赖于任何应用或服务。你完全可以升级这些应用或服务而不必管PAM的共享库的更新或升级,,反之亦然。所以它非常的灵活。

他就是一共享库,就像window下的dll文件。UNIX/LINUX的最大有优点之一就是高内聚低耦合。这不就体现了吗。

哦~,原来PAM是这么一回事,那么终于知道了为什么在“文件打开过多(Too many open files)上”一文中要提到要在/etc/pam.d/login下添加一下语句

sessionrequired pam_limits.so

那么在login添加只是在su切换用户的时候limit.conf才生效,也打开了为什么ssh过去看不到设置的数值而su用户之后却能看到。

那login可以添加PAM功能,按道理,ssh应该也是可以的。再验证了一边,ssh确实也可以,配置在/etc/ssh/sshd_config文件里。里面有一项“UsePAM yes”把这项的#去掉,开启这个功能就可以了(具体PAM验证模块也在/etc/pam.d/目录的sshd配置文件里)。

3、那如果只设置了login的pam_limits.os,而关闭了ssh的。那么在两种状态的下开启的进程是如何呢?

带着这个疑问又在网上找了一些测试代码,经过加工如下:

#include<stdio.h>

#include<unistd.h>

#include<stdlib.h>

#include<sys/resource.h>

main()

{

struct rlimit limit;

while(1){

getrlimit(RLIMIT_NOFILE,&limit);

printf("the process can open %dfiles\n",limit.rlim_cur);

sleep(2);

}

}

这块代码是通过打印当前进程最大的文件打开书。经过测试,su进去的用户打开进程,打印的确实是limit.conf设置的值,而通过ssh进去执行这代码打印的却是修改limit.conf参数前的值(就是limit.conf没有生效)。

这可能跟linux系统的进程、用户会话方面有关系,因为知识面窄,所以在论坛上提问了一下,网友就给了我我这样一个连接:。原文有这样一句话:

The pam_limitsPAM module sets limits on the system resources that can be obtained in auser-session. Users of uid=0 are affected by this limits, too.

这个pam_limitsPAM再用户会话上有效,对0号进程(内核进程)也有是有效的。

在进程里面还有一个疑问,我们平时的操作时都是通过终端去操作的,开启进程的父进程都是当前终端进程,例如ssh,但有一些进程是在后台运行的。当开启了后,关闭终端,那他们归属谁呢?通过观察发现。这些孤独的进程都是被1号进程接收了。这里可能就涉及到linux进程管理的问题了。不在深入研究了。

4、那pam_limits的生效跟进程有关系吗?

我想到了一种情况,如果我用ssh进去开启进程,这父进程的ID是我这ssh进程。当我退出ssh后,那个子进程没有关闭就归1号进程管了(例如我们常见的java进程)。那这个子进程的最大文件打开数会不会就变回limit.conf文件设置的值呢?因为ssh进程进去的值是limit.conf修改前的值。ssh进去开启我那测试进程打印的确实是跟当前的limit.conf值不一样,就是没有生效。我又在网上找到了一个方法,直接把那测试代码的子进程直接赋予给1号进程:setsid。经过测试,打印出来的最大文件打开数没变。就像上面说的这个PAM设置跟用户会话有关系。

测试over。以后发现有问题,继续跟进。

自己要先看得起自己,别人才会看得起你

文件打开过多(Too many open files)下

相关文章:

你感兴趣的文章:

标签云: