如何在 Linux 上限制用戶級別的進程

當系統被大量使用時,系統管理員對資源的管理將是一個很大的挑戰。 Ulimit(用戶限制)是一個強大的命令,有助於限制系統上的資源。

有時,但不是很頻繁,單個用戶可能會啟動太多進程,從而使系統不穩定。 為了緩解這種情況,我們可以使用 ulimit 命令來限制每個用戶或組可以運行的進程數。

在本教程中,我們將學習如何在 Linux 上限制用戶級別的進程。

使用 ulimit 您可以設置兩種限制:

  • 硬限制:此限制是出於安全目的。 硬限制只能由 root 完成(即非 root 進程不能超過硬限制)
  • 軟限制:此限制可以隨時由進程更改。 非用戶可以為其進程設置介於(0 和硬限制)之間的限制。

檢查所有電流限制

您可以檢查當前登錄用戶的所有限制。

運行以下 ulimit 命令 -a 選項:

$ 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”文件中進行更新。

在我們的 example,我們將系統所有用戶的最大文件數設置為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”文件中讀取。 以下是相當於 ulimits 的 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 文件。

為了 example,您可以嘗試如下:

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

結論

在本教程中,我們學習瞭如何使用 ulimit 命令為用戶設置進程限制。 希望您喜歡閱讀,請在評論部分留下您的建議或反饋。

另請閱讀:

  • 在 Linux 中限制進程 CPU 使用率的 2 種方法