Ce face ulimit
ulimit este o comandă internă Bash care controlează limitele de resurse ale shell-ului curent și ale proceselor pornite din el. Cea mai cunoscută este limita de fișiere deschise (-n): un server web sau o bază de date cu multe conexiuni poate da eroarea „Too many open files” dacă limita este mică.
Fiecare limită are două valori: limita soft (-S), cea aplicată efectiv, și limita hard (-H), plafonul până la care un utilizator obișnuit poate crește limita soft. Doar root poate crește limita hard.
Schimbarea făcută cu ulimit ține doar în sesiunea curentă. Limitele permanente se setează în /etc/security/limits.conf (pentru sesiunile de login) sau, pentru serviciile systemd, cu directive precum LimitNOFILE= în fișierul unității.
Opțiuni și argumente
| Opțiune / Parametru | Descriere |
|---|---|
-a |
Afișează toate limitele curente. |
-n |
Numărul maxim de fișiere deschise (descriptori). |
-u |
Numărul maxim de procese ale utilizatorului. |
-c |
Mărimea maximă a fișierelor core dump (0 = dezactivate). |
-S / -H |
Lucrează cu limita soft / hard; fără ele, setarea le schimbă pe amândouă. |
unlimited |
Valoare specială: fără limită. |
Exemple
Exemplul 1: Limita soft și limita hard pentru fișiere deschise
Valori tipice pe Ubuntu pentru un utilizator obișnuit.
ulimit -Sn
ulimit -Hn
Ieșire în terminal
1024
524288
Exemplul 2: Limită temporară într-un subshell
Parantezele pornesc un subshell; limitele schimbate acolo nu afectează shell-ul principal. Limita poate fi coborâtă oricând, fără drepturi de root.
( ulimit -n 256; echo "fișiere deschise: $(ulimit -n)" )
( ulimit -c 0; echo "core dump: $(ulimit -c)" )
Rezultat
fișiere deschise: 256
core dump: 0
Exemplul 3: Limită permanentă pentru un serviciu systemd
Pentru serviciile pornite de systemd, limits.conf nu se aplică. Creăm un fișier override cu LimitNOFILE, repornim serviciul și citim limita procesului din /proc.
sudo mkdir -p /etc/systemd/system/nginx.service.d
printf '[Service]\nLimitNOFILE=65535\n' | sudo tee /etc/systemd/system/nginx.service.d/limite.conf
sudo systemctl daemon-reload
sudo systemctl restart nginx
grep "open files" /proc/$(pgrep -o nginx)/limits
Ieșire în terminal
[Service]
LimitNOFILE=65535
Max open files 65535 65535 files
Greșeli frecvente
- Așteptarea ca
ulimit -n 65535dintr-un terminal să schimbe limita unui serviciu deja pornit: fiecare proces își păstrează limitele de la pornire. - Încercarea unui utilizator obișnuit de a depăși limita hard: Bash răspunde cu „cannot modify limit: Operation not permitted”.