ulimit: différence entre les limites dures et souples

87

Quelle est la difference entre hard et soft limits in ulimit?

Pour le nombre de fichiers ouverts, j'ai une limite souple de 1024 et une limite stricte de 10240. Il est possible d'exécuter des programmes ouvrant plus de 1024 fichiers. Quelle est la limite souple pour?

daniel kullmann
la source
4
Parlez-vous ulimit -n? Essayez de lancer un shell avec une valeur très basse ( bash -c 'ulimit -n 4; exec 3>a; exec 4>b; exec 5>c'). Quelle est la sortie?
Gilles le

Réponses:

77

Une limite stricte ne peut être levée que par root (tout processus peut la réduire). Il est donc utile pour la sécurité: un processus non root ne peut pas outrepasser une limite stricte. Mais il est gênant qu'un processus non root ne puisse avoir une limite inférieure à celle de ses enfants.

Une limite souple peut être modifiée par le processus à tout moment. C'est donc pratique tant que les processus coopèrent, mais cela n'est pas bon pour la sécurité.

Un cas d'utilisation typique des limites logicielles consiste à désactiver les core dumps ( ulimit -Sc 0) tout en gardant la possibilité de les activer pour un processus spécifique que vous déboguez ( (ulimit -Sc unlimited; myprocess)).

La ulimitcommande shell est un wrapper autour de l' setrlimitappel système, c'est là que vous trouverez la documentation définitive.

Notez que certains systèmes peuvent ne pas implémenter toutes les limites. Plus précisément, certains systèmes ne prennent pas en charge les limites par descripteur de fichier (contrairement à Linux); si le vôtre ne le fait pas, la commande shell peut être un no-op.

Gilles
la source
6
+1 pour le cas d'utilisation des limites souples. La taille limite des résidents ( ulimit -m, RLIMIT_RSS) est un exemple de limite qui n’est plus effective sous Linux. La limite de mémoire virtuelle ( ulimit -v, RLIMIT_AS) fonctionne cependant.
Adam Zalcman
@ Gilles, voulez-vous dire sans redémarrer le processus, lorsque nous modifions la limite souple, cela peut avoir un effet immédiat?
Ryan
1
@Ryan Oui, un programme peut modifier sa propre limite logicielle à tout moment en appelant setrlimit(dans la mesure où la limite stricte le permet, à moins de s'exécuter en tant que racine, bien sûr). La plupart des programmes n'ont pas de commande permettant à l'utilisateur de le faire, mais vous pouvez essayer de le joindre au programme avec un débogueur et de le faire émettre un setrlimitappel. Sous Linux, vous pouvez appeler prlimit(pour lequel je ne connais aucun shell utilitaire).
Gilles
1
Il existe maintenant un prlimitutilitaire shell aussi.
telcoM
0

La limite stricte est pour des raisons de sécurité. Pour un utilisateur non root, il ne peut que réduire la limite stricte par rapport à la limite fixe actuellement définie. il ne peut pas l'augmenter. L'augmentation de la limite stricte ne peut être effectuée que par l'utilisateur root (ou peut-être avec le privilège sudo, pas sûr de cela). Ce qu'un utilisateur non root peut faire, c'est choisir une limite (appelée limite logicielle) qui peut être comprise dans la plage [0, limite stricte] pour ses processus. C'est la limite souple qui est vue et prise en compte par les processus.

Ankit Shubham
la source