ulimit în Linux / Bash

Discuri și sistem Bash built-in

Afișează și setează limitele de resurse ale shell-ului: fișiere deschise, procese, mărimea fișierelor core.

Sintaxă comandă
ulimit [-S|-H] [-a|-n|-u|-c|-f|-s|-v] [limită]

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 65535 dintr-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”.

Comenzi înrudite

  • env: Afișează variabilele de mediu sau rulează o comandă cu un mediu modificat, fără să schimbe shell-ul curent.
  • systemctl: Controlează sistemul de inițializare systemd și administrează serviciile (demoni de fundal).
  • ps: Afișează o captură instantanee (snapshot) a proceselor active din sistem.