首页 > 编程知识 正文

linux的exec命令,linux 文件描述符

时间:2023-05-05 22:20:02 阅读:170661 作者:4163

一. linux的文件描述符

文件描述符(FD :文件描述符)也可以称为文件句柄。 当某个程序打开文件时,内核返回相应的文件描述符,并且该程序必须引用该描述符才能处理该文件。 文件描述符是一个正整数,用于标识进程打开的每个文件和套接字。 前三个文件描述符(0,1,2 )分别对应标准输入(stdin )、标准输出(stdout )、标准错误(stderr ),之后打开的文件同样对应3,4…。

linux系统对用户、进程或整个系统的打开文件描述符的数量有限制,默认值通常为1024。 如果系统或APP应用程序日志中出现“too many open files”错误日志,这实际上并不是因为打开的文件过多,而是因为打开的文件描述符的数量达到了限制,从而限制了文件描述符的数量

1.1获取系统打开的文件描述符的数量

[ root @ localhost~] # cat/proc/sys/fs/file-NR 12160197787//第一列1216 :已分配软盘数量//第二列0 :已分配但未使用的软盘数量/1.2获取进程打开的文件描述符的数量

[ root @ localhost~~ ] # pidof vim 3253 [ root @ localhost~~ ] # ll/proc/3253/FD总用量0lrwx----1testtest64月8日8月33666日0lrwx----1testtest64月8日18336011---dev/pts/0 lrwx---1 test test 646月8日183360114---home/test/. bash,

如果出现“too many open files”错误,则必须增加文件描述符的限制数量。 由于系统的缺省文件描述符很大,因此通常只需要增加用户或进程的数量

//用户或进程[ root @ localhost~~ ] # ulimit-n 1024 [ root @ localhost~~ ] # ulimit-n 10240 [ root @ localhost~~ ] 要进行永久更改,请按如下方式修改文件/etc/security/limit.conf

[ root @ localhost~] # VI/etc/security/limits.conf是“abchardnofile 10240”ABC :用户名,即test使用ulimit命令创建的软盘

硬件:限制类型。 有soft/hard两种。 达到soft限制时,系统日志(通常为/安静的笔/log/messages )会显示警告日志,但不影响使用。 hard,达到这个限制,有日志,影响使用。

nofile :限制内容,nofile - max number of open files

1024 :值

更改后,退出终端并再次登录,确认在ulimit中是否有效。 如果未启用,可以将ulimit -n 10240添加到abc用户的. bash_profile文件中,以便在每次用户abc登录时将软盘的最大值更改为10240。 例如:

[ root @ localhost~] # echo ' ulimit-n 10240 '/home/ABC/. bash _ profile 10240 [ root @ localhost~] # su-ABC [ ABC ]

//系统级

将整个操作系统中可用的软盘数量更改为51200

[ root @ localhost~] # echo ' 51200 '/proc/sys/fs/fs/file-max [ root @ localhost~] # cat/proc/sys/fs/fs/file -

例如:

[ root @ localhost~] # echo ' fs.file-max=

51200" >> /etc/sysctl.conf

二、获取打开的文件数量

linux的一切皆为文件,那么如何知道系统/应用打开了哪些或是多少个文件呢?很简单,用lsof命令就行了,lsof,list open files的简写,可列出程序或系统正在使用的文件。

2.1 获取整个系统打开的文件数量

[root@localhost ~]# lsof |wc -l1864

2.2 获取某个用户打开的文件数量

[root@localhost ~]# lsof -u test |wc -l15

2.3 获取某个程序打开的文件数量

[root@localhost ~]# pidof vim3253[root@localhost ~]# lsof -p 3253 |wc -l31

上面所示只是用lsof来显示已打开的文件数量,lsof的功能远不止这些,有兴趣可以man lsof看一下

三、进程打开的文件描述符与文件

如前面说的,为什么说“too many open files”错误不是说打开的文件过多,而是打开的文件描述符数量已达到了限制,这个简单的可以用man ulimit就可得知

[abc@localhost ~]$ man ulimit

//找到ulimit,可以看到下列一行

-n The maximum number of open file descriptors (most systems do not allow this value to be set)

这行就说明了用ulimit -n xxx 更改的是文件描述符而不是文件的最大值。

我们可以来测试一下:
打开一个进程vim,获取vim打开的文件及文件描述符数量

[abc@localhost ~]$ lsof -p 3330 |wc -l //文件数量31[abc@localhost ~]$ ls /proc/3330/fd |wc -l //文件描述符数量4[abc@localhost ~]$ killall -9 vim[1]+ 已杀死 vim .bash_profile[abc@localhost ~]$ ulimit -n 20

更改限制,并测试vim的运行情况

[abc@localhost ~]$ ulimit -n 20 //更改为20,即小于文件数量31[abc@localhost ~]$ ulimit -n20 [abc@localhost ~]$ vim .bash_profile //可看到vim可以正常打开文件# .bash_profile# Get the aliases and functionsif [ -f ~/.bashrc ]; then . ~/.bashrcfi# User specific environment and startup programsPATH=$PATH:$HOME/binexport PATHulimit -n 10240----------------------------------[abc@localhost ~]$ ulimit -n 3 //更改为3,即小于FD数量4[abc@localhost ~]$ ulimit -n3[abc@localhost ~]$ vim .bash_profile -bash: start_pipeline: pgrp pipe: Too many open files vim: error while loading shared libraries: libselinux.so.1: cannot open shared object file: Error 24

从上面可看到小于文件描述符的数值时即报“Too many open files”错误,那么这个应该可以说明这个“Too many open files”错误是是打开的文件描述符数量已达到了限制所引起的,跟打开的文件数量没有关系。

另用lsof可知道进程都打开了哪些文件和文件描述符:
[abc@localhost ~]$ lsof -p 3330
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
vim 3555 abc cwd DIR 253,0 4096 923587 /home/abc
vim 3555 abc rtd DIR 253,0 4096 2 /
vim 3555 abc txt REG 253,0 1971360 287900 /usr/bin/vim
vim 3555 abc mem REG 253,0 155696 846 /lib64/ld-2.12.so
vim 3555 abc mem REG 253,0 26104 281208 /usr/lib64/libgpm.so.2.1.0
vim 3555 abc mem REG 253,0 1912928 847 /lib64/libc-2.12.so
vim 3555 abc mem REG 253,0 22536 852 /lib64/libdl-2.12.so
vim 3555 abc mem REG 253,0 145672 859 /lib64/libpthread-2.12.so
vim 3555 abc mem REG 253,0 598816 848 /lib64/libm-2.12.so
vim 3555 abc mem REG 253,0 124624 857 /lib64/libselinux.so.1
vim 3555 abc mem REG 253,0 113904 856 /lib64/libresolv-2.12.so
vim 3555 abc mem REG 253,0 1489600 406575 /usr/lib64/perl5/CORE/libperl.so
vim 3555 abc mem REG 253,0 142504 96 /lib64/libncurses.so.5.7
vim 3555 abc mem REG 253,0 34336 890 /lib64/libacl.so.1.1.0
vim 3555 abc mem REG 253,0 43392 869 /lib64/libcrypt-2.12.so
vim 3555 abc mem REG 253,0 387880 868 /lib64/libfreebl3.so
vim 3555 abc mem REG 253,0 1753952 271694 /usr/lib64/libpython2.6.so.1.0
vim 3555 abc mem REG 253,0 17520 886 /lib64/libutil-2.12.so
vim 3555 abc mem REG 253,0 138280 826 /lib64/libtinfo.so.5.7
vim 3555 abc mem REG 253,0 20280 887 /lib64/libattr.so.1.1.0
vim 3555 abc mem REG 253,0 116136 889 /lib64/libnsl-2.12.so
vim 3555 abc mem REG 253,0 61624 42 /lib64/libnss_files-2.12.so
vim 3555 abc mem REG 253,0 26050 265158 /usr/lib64/gconv/gconv-modules.cache
vim 3555 abc mem REG 253,0 124855 528606 /usr/share/vim/vim72/lang/zh_CN/LC_MESSAGES/vim.mo
vim 3555 abc mem REG 253,0 135533 528604 /usr/share/vim/vim72/lang/zh_CN.UTF-8/LC_MESSAGES/vim.mo
vim 3555 abc mem REG 253,0 99158752 264902 /usr/lib/locale/locale-archive
vim 3555 abc 0u CHR 136,0 0t0 3 /dev/pts/0
vim 3555 abc 1u CHR 136,0 0t0 3 /dev/pts/0
vim 3555 abc 2u CHR 136,0 0t0 3 /dev/pts/0
vim 3555 abc 4u REG 253,0 4096 923589 /home/abc/.bash_profile.swp
可看到运行vim时,打开了很多个文件,但文件描述符只有后面四个。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。