如何在Linux上限制用户级别的进程
当系统被大量使用时,对系统管理员来说,管理资源将是一个巨大的挑战。
Ulimit(用户限制)是一个功能强大的命令,有助于限制系统上的资源。
有时,但不是很常见,单个用户可能会启动太多进程,从而使系统不稳定。
为了减轻这种情况,我们可以使用ulimit命令来限制每个用户或者组可以运行的进程数。
在本教程中,我们将学习如何在Linux上限制用户级别的进程。
使用ulimit可以设置两种限制:
- 硬限制:此限制是出于安全目的。硬限制只能通过root来增加(即非root进程不能超过硬限制)
- 软限制:可以随时通过过程更改此限制。非用户可以为其进程设置一个介于(0和硬限制)之间的限制。
检查所有电流限制
我们可以检查当前登录用户的所有限制。
使用'-a'选项运行以下ulimit命令:
$ulimit -a core file size (blocks, -c) unlimited data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 3177 max locked memory (kbytes, -l) 16384 max memory size (kbytes, -m) unlimited open files (-n) 1024 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) 8192 cpu time (seconds, -t) unlimited max user processes (-u) 3177 virtual memory (kbytes, -v) unlimited file locks (-x) unlimited
我们会看到有一些无限的设置。
这些限制可以更改。
注意:“/proc”文件系统将每个进程的限制存储在位于“/proc/4548/limits”的文件系统对象中,其中“ 4548”是进程的PID或者进程标识符。
为用户设置ulimit
我们可以使用'ulimit -u'查找最大用户进程或者nproc限制。
$ulimit -u 3177
我们可以通过以下命令更改最大用户进程:
# ulimit -u 3500
如果遇到任何错误或者无法更改,请检查是否在“ /etc/security/limits.conf”中设置了任何限制。
可以在limits.con文件中为特定用户或者组设置限制。
如果要将“ infrateam”设置为比“ testers”处理更多,并将用户bob nproc限制为“ 60”,请进行以下设置:
@bob hard nproc 60 @testers hard nproc 100 @infrateam hard nproc 300
其中我们设置限制为使用“ nofile”字段打开文件。
当我们设置软限制时,用户将在达到下限时收到警告。
@infrateam soft nofile 2000 @infrateam hard nofile 3000
为打开的文件设置Ulimit
我们可以使用ulimit命令查看每个用户的限制打开文件。
检查用户级别的打开文件硬限制
$ulimit -Hn 4096
检查用户级别的打开文件软限制
# ulimit -Sn 1024
如果要更改当前打开的文件限制(软或者硬),则可以在“ limits.conf”文件中进行更新。
在我们的示例中,我们将为系统的所有用户将最大文件数设置为16384.
# vim /etc/security/limits.conf # Then you can add two lines for each limit: * soft nofile 16384 * hard nofile 16384
重新启动计算机并测试新的限制配置
要检查Linux系统范围内当前打开文件的最大数量,请运行以下命令:
# cat /proc/sys/fs/file-max 80786
要更改打开文件的最大数量,请运行以下命令:
# sysctl -w fs.file-max=90786
使它在“ sysctl.conf”文件中的重新启动更新后持续存在
# vi /etc/sysctl.conf fs.file-max=90786
通过systemd设置用户限制
之前我们讨论过可以通过编辑'/etc/security/limits.conf'文件来设置限制,但是systemd会忽略该文件。
默认情况下,Systemd从“ /etc/systemd/system.conf”文件中读取。
以下是与ulimit等效的systemd限制。
Directive ulimit equivalent Unit LimitCPU= ulimit -t Seconds LimitFSIZE= ulimit -f Bytes LimitDATA= ulimit -d Bytes LimitSTACK= ulimit -s Bytes LimitCORE= ulimit -c Bytes LimitRSS= ulimit -m Bytes LimitNOFILE= ulimit -n Number of File Descriptors LimitAS= ulimit -v Bytes LimitNPROC= ulimit -u Number of Processes LimitMEMLOCK= ulimit -l Bytes LimitLOCKS= ulimit -x Number of Locks LimitSIGPENDING= ulimit -i Number of Queued Signals LimitMSGQUEUE= ulimit -q Bytes LimitNICE= ulimit -e Nice Level LimitRTPRIO= ulimit -r Realtime Priority LimitRTTIME= No equivalent
我们可以通过编辑“ /etc/systemd/user.conf”文件来设置用户限制。
例如,我们可以尝试如下操作:
vim /etc/systemd/user.conf DefaultLimitNOFILE=20000
通过systemd启动的某些服务会忽略“ /etc/security/limits.conf”文件。
要解决此问题,我们应该在服务定义文件中设置限制。
我们需要更新服务文件,如下所示:
[Unit] Description=Some Daemon After=syslog.target network.target [Service] Type=notify LimitNOFILE=20000 ExecStart=/usr/sbin/somedaemon [Install] WantedBy=multi-user.target