如何在Linux上限制用户级别的进程

时间:2020-03-05 15:28:26  来源:igfitidea点击:

当系统被大量使用时,对系统管理员来说,管理资源将是一个巨大的挑战。
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