Pourquoi ulimit ne fonctionne pas lorsqu'il est exécuté avec sudo?

9

Bien..

$ ulimit -s
8192
$ sudo ulimit -s 16384
$ ulimit -s
8192

Pourquoi ulimitme manque- t-il de respect d'une manière aussi barbare?

ntl0ve
la source
1
Vous auriez le même problème avec cd.
David Schwartz

Réponses:

10

ulimitest spécifique au shell / processus. Sautez le sudo.

$ ulimit -s
8192
$ ulimit -s 16384
$ ulimit -s
16384
Daniel Beck
la source
Je suis surpris de sudone pas avoir donné d'erreur lors de son adoption ulimit; généralement, il a besoin d'un binaire externe, mais ulimitc'est un shell intégré.
amphetamachine
@amphetamachine Check out which ulimit. Rien de surprenant.
Daniel Beck
Cette réponse est horriblement trompeuse et inutile, même si elle est basée sur un grain de vérité.
hmijail pleure les démissionnaires
3

La réponse de Daniel Beck ne dit pas toute la vérité (en fait c'est un peu un tour de passe-passe), et n'aide pas les gens qui ont réellement besoin de faire "sudo ulimit".

Le problème est que

  • ulimit a des limites douces et dures
  • une fois que vous avez défini la limite stricte, vous devez être superutilisateur pour la définir plus haut
  • sudo démarre un nouveau shell; quand vous le quittez, vous êtes de retour à votre ancien ulimit!

Explication détaillée

L'exemple de Daniel ne fonctionne que dans une situation très spécifique (qui est heureusement celle par défaut).

Contre-exemple:

$ ulimit -s 8191              # set both hard and soft limits
$ ulimit -s                   # show current soft limit
8191
$ ulimit -s 16384             # set both hard and soft limits
-bash: ulimit: stack size: cannot modify limit: Operation not permitted

Donc, vous définissez la limite avec ulimit -s, et cela va définir des limites souples et strictes. Maintenant, vous ne pouvez pas le régler plus haut.
À ce stade, vous pourriez penser à essayer sudo; mais cela ne fonctionnera pas, à cause de ce que Daniel a écrit.

$ sudo ulimit -s 16384        # maybe with sudo?
$ ulimit -s
8191
$

Ce qui s'est passé ici, c'est que a sudocommencé un nouveau shell, où il a fonctionné ulimit; et dans CET obus, le nouvel ulimit a été défini. Mais ensuite, cet obus a terminé son travail, a été démoli, et maintenant vous êtes de retour dans votre ancien obus avec son ulimit précédent.

Preuve:

$ ulimit -s 8191
$ ulimit -s
8191
$ sudo bash
# ulimit -s
8191
# ulimit -s 16384
# ulimit -s                           # It worked!
16384
# exit
exit
$ ulimit -s                           # ... but now we're back to the old ulimit.
8191
$

Alors, pourquoi l'exemple de Daniel a-t-il fonctionné exactement? En raison des limites matérielles et logicielles par défaut d'ulimit, il pouvait repousser la limite logicielle vers la valeur stricte. Nous pouvons le faire au ralenti pour montrer l'astuce:

$ ulimit -Ss                 # show the Soft limit
8192
$ ulimit -Hs                 # show the Hard limit
65532
$ ulimit -s                  # by default, shows the Soft limit
8192
$ ulimit -s 16384            # set both the Soft and Hard limit
$ ulimit -s                  # shows the Soft limit
16384
$ ulimit -Hs                 # but, gotcha! the Hard limit has also been set
16384
$ ulimit -s 16385            # so now we can't go higher
-bash: ulimit: stack size: cannot modify limit: Operation not permitted
$

En résumé: si vous définissez votre limite stricte et que vous souhaitez la repousser, vous n'avez pas de chance dans ce shell , ... sauf si vous restez en tant que superutilisateur ou utilisez une incantation pour supprimer les privilèges par la suite.

hmijail pleure les démissionnaires
la source