用户限制管理命令ulimit的使用

用户限制管理命令ulimit的使用

微信搜索 zze_coding 或扫描 👉 二维码关注我的微信公众号获取更多资源推送:

Linux 系统对于每个用户都有其默认的限制规则,对于这些限制规则的管理可使用 ulimit 命令来完成。

ulimit 命令的使用规则如下:

ulimit [-aHS][-c <core文件上限>][-d <数据节区大小>][-f <文件大小>][-m <内存大小>][-n <文件数目>][-p <缓冲区大小>][-s <堆叠大小>][-t <CPU时间>][-u <程序数目>][-v <虚拟内存大小>]
	-a  显示目前资源限制的设定。
	-c <core文件上限>  设定core文件的最大值,单位为区块。
	-d <数据节区大小>  程序数据节区的最大值,单位为KB。
	-f <文件大小>  shell所能建立的最大文件,单位为区块。
	-H  设定资源的硬性限制,也就是管理员所设下的限制。
	-m <内存大小>  指定可使用内存的上限,单位为KB。
	-n <文件数目>  指定同一时间最多可开启的文件数。
	-p <缓冲区大小>  指定管道缓冲区的大小,单位512字节。
	-s <栈大小>  指定堆栈大小的上限,单位为KB。
	-S  设定资源的弹性限制。
	-t <CPU时间>  指定CPU使用时间的上限,单位为秒。
	-u <程序数目>  用户最多可开启的程序数目。
	-v <虚拟内存大小>  指定可使用的虚拟内存上限,单位为KB。

我们可以通过 ulimit -a 查看默认的限制:

$ ulimit -a
# 内核文件最大值
core file size          (blocks, -c) 0
# 进程数据块的大小
data seg size           (kbytes, -d) unlimited
# 调度优先级
scheduling priority             (-e) 0
# Shell 所能建立的最大文件
file size               (blocks, -f) unlimited
# 等待信号
pending signals                 (-i) 1796
# 可加锁内存大小
max locked memory       (kbytes, -l) 64
# 可使用内存的上限
max memory size         (kbytes, -m) unlimited
# 最大打开文件描述符数
open files                      (-n) 1024
# 管道缓冲区的大小
pipe size            (512 bytes, -p) 8
# POSIX 消息队列
POSIX message queues     (bytes, -q) 819200
# 实时优先级
real-time priority              (-r) 0
# 栈大小
stack size              (kbytes, -s) 8192
# CPU 使用时间的上限
cpu time               (seconds, -t) unlimited
# 最多可开启的程序数目
max user processes              (-u) 1796
# 可使用的虚拟内存上限
virtual memory          (kbytes, -v) unlimited
# 文件锁
file locks                      (-x) unlimited

这里我们常修改的一项是 open files,即每个用户最大打开文件句柄数,它的默认值是 1024,最大值为 1024^2 即 1048576。

因为任何设备在 Linux 下都是文件,通信的接口也有专门的接口文件负责,所以 Linux 下进程 TCP 链接的最大并发量也受限于该值。

这个值可用 ulimit -n 命令来修改,但 ulimit 命令修改的数值只对当前登录用户的目前使用环境有效,系统重启或者用户退出后就会失效。

如果我们希望对某些限制的设定永久生效,则可以统一将限制规则定义在 /etc/security/limits.conf 中,该文件不但能对指定用户的资源进行限制,还能对指定组的资源进行限制。该文件的使用规则如下:

 <domain> <type> <item> <value> 
	domain:表示用户或者组的名字,还可以使用 * 作为通配符,表示任何用户或用户组;
	type:表示限制的类型,可以有两个值,soft 和 hard,分别表示软、硬资源限制。
	item:表示需要限定的资源名称,常用的有 nofile、cpu、stack 等。分别表示最大打开句柄数、占用的 CPU 时间、最大的堆栈大小;
	value:表示限制各种资源的具体数值;

各项可有如下取值:
    <domain>:
        可以是一个用户名;
        可以是使用 @group 语法的组名,这不应与网络组混淆;
        可以使用 * 作为通配符,表示任何用户或用户组;
        通配符 %(仅用于 maxlogins 限制)也可以与 %group 语法一起使用。如果单独使用 % 通配符,则与在 maxsyslogins 限制中使用 * 是相同的。通过在 % 之后指定一个组,它限制所有成员用户的登录总数;
        指定为 <min_uid>:<max_uid> 的uid范围。如果省略 min_uid,则对 max_uid 进行精确匹配。如果省略 max_uid,所有大于或等于 min_uid 的 uid 都匹配;
        指定为 @<min_gid>:<max_gid> 的范围,如果省略 min_gid,则与 max_gid 完全匹配。如果省略了 max_gid,则匹配所有大于或等于 min_gid 的组。对于完全匹配,包括用户附加组在内的所有组都是检查。对于范围匹配,仅检查用户的主要组;
        指定为 %:<gid> 的 gid 仅适用于 maxlogins 限制。它限制了作为成员的所有用户的登录总数;

    <type>:
        hard:用于执行硬资源限制。这些限制由管理员设置,并由内核实施。用户不能使用超过这些值的系统资源;
        soft:用于执行软资源限制。用户可以在任何范围内向上或向下移动的限制,预先存在的硬性限制,对于正常的系统使用情况,可以将此令牌指定的值视为默认值;
        -:同时执行软硬限制,请注意,如果您指定类型为“-”,但忽略提供 item 和 value 字段,则该模块将永远不会实施任何限制在指定的用户/组等上;

    <item>:
        core:内核文件最大值 (KB);
        data:进程数据块的大小(KB);
        fsize:Shell 所能建立的最大文件(KB);
        memlock:可加锁内存大小 (KB);
        nofile:可打开最大打开文件描述符数;
        rss:最大居民集大小(KB)(在Linux 2.4.30及更高版本中被忽略);
        stack:栈大小(KB);
        cpu:CPU 使用时间的上限;
        nproc:最多可开启的程序数目;
        as:地址空间限制(KB);
        maxlogins:该用户的最大登录次数(此限制不适用于uid = 0的用户);
        maxsyslogins:系统上所有登录的最大数量,如果所有用户的登录总数大于,则不允许用户登录,指定的数字(此限制不适用于 uid=0 的用户);
        priority:运行用户进程的优先级(负值可提高进程优先级);
        locks:锁文件最大数量(Linux 2.4及更高版本);
        sigpending:待处理信号的最大数量(Linux 2.6及更高版本);
        msgqueue:POSIX消息队列使用的最大内存(bytes)(Linux 2.6和更高版本);
        nice:允许最多提高到的优先级:[-20,19](Linux 2.6.12 及更高版本);
        rtprio:非特权进程允许的最大实时优先级(Linux 2.6.12和更高版本);

该文件的使用规则可以使用 man limits.conf 查看。

除了 /etc/security/limits.conf文件之外,还有一个 /etc/security/limits.d 目录,可以将资源限制创建一个文件放到这个目录中,默认系统会首先去读取这个目录下的所有文件,然后才去读取 limits.conf 文件。所有资源限制设置完成后,退出 Shell 终端,再次登录 Shell 终端后,ulimit 设置即可自动生效。

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可

Links: https://www.zze.xyz/archives/linux-cmd-limit.html

Buy me a cup of coffee ☕.