# [QUOTA] Quota cpu, quota memoire vive comment faire ?

## Babali

Salut a tous,

Comment faire pour mettre en place des quota d'utilisation de cpu et des quota d'utilisation de me memoire vive ?

Merci.  :Smile: 

----------

## GaMeS

 *Babali wrote:*   

> 
> 
> des quota d'utilisation de cpu
> 
> 

 

C'est pas exactement ce que tu veux, mais avec renice on se rapproche des priorités sur le processeur.

----------

## Babali

Je veux vraiment empecher un utilisateur de pomper tout le cpu et de saturer une machine.

Je veux pouvoir executer (avec bash, mais ne le faites pas) :

```
o(){ o&o&};o
```

 sans saturer ma machine. Donc pour ca j'ai besoins de quota et egalement de quota en nombre de processus.Last edited by Babali on Sat Feb 10, 2007 1:17 am; edited 1 time in total

----------

## kwenspc

Grsec, dans le noyau. Chiant à configurer il paraît. (mais ça doit pouvoir résoudre ton problème)

----------

## _droop_

 *Babali wrote:*   

> 
> 
> ```
> o(){ o&o&};o
> ```
> ...

 

Salut,

Avec ulimit tu peux limiter le nombre de processus par utilisateur.

```
ulimit -u 4096
```

devrait limiter les risques. (Il me semble que l'on peut aussi limiter la profondeur pour le lancement de processus).

On peut fixer les limites dans /etc/security/limits.conf par utilisateur et/ou par groupe.

----------

## kaworu

 *Babali wrote:*   

> 
> 
> ```
> o(){ o&o&};o
> ```
> ...

 

waaa, la belle bleue !

le manuel de la sécurité pour Gentoo pourra t'aider je pense :

voici la partie qui t'interesse =>

http://www.gentoo.org/doc/fr/security/security-handbook.xml?full=1#book_part1_chap5

----------

## Babali

Merci pour toutes vos reponses  :Smile:  Je vais explorer tout ca  :Smile: 

----------

## El_Goretto

A mais non, je veux savoir ce que çà fait, cette bête  :Smile: 

```
o(){ o&o&};o
```

----------

## bong

C'est une fonction bash qui fait un double appel récursif... 

Si tu veux "ralentir un peu ton systeme", c'est efficace.

Serieusement, si un aventurier tente d'executer ça, qu'il vienne témoigner après  :Very Happy: 

----------

## El_Goretto

 *bong wrote:*   

> Serieusement, si un aventurier tente d'executer ça, qu'il vienne témoigner après 

 

Tu sous-estimes gravement la curiosité humaine  :Wink: 

Note pour les aventuriers en question: ça marche aussi sous Cygwin, j'ai ess... euh, je veux dire on peut s'y attendre très fortement  :Smile: 

[/me sifflote]

----------

## Temet

Pour avoir vu le message "wa la belle bleue" ... et qui m'a paru inoffensif, je précise que ces petits caractères m'ont obligé à un hardreboot avec un pc complètement figé en plein travail (même serveur ssh ne répond pas).

Bref, la prochaine fois que tu mets un truc comme ça, tu préviens ... d'un coup je t'aime déjà pas beaucoup, mais j'aurais crashé mon fs, je t'aurais méchamment détesté.

Conclusion pour les curieux qui se disent : "bah, ça ressemble pas un 'rm -rf ~' quand même" ... bah abstenez vous.

----------

## nemo13

>> temet 

tu as mal lu :

 *Babali wrote:*   

> Je veux vraiment empecher un utilisateur de pomper tout le cpu et de saturer une machine.
> 
> Je veux pouvoir executer (avec bash, mais ne le faites pas) :
> 
> ```
> ...

 

celui-là je ne l'ai pas , encore, essayé

( le temps de faire une petite sauvegarde en fait   :Rolling Eyes:  )

----------

## anigel

 *kaworu wrote:*   

> waaa, la belle bleue !

 

En voilà un qui n'a pas écouté les mises en garde ;-).

Pour information, ce code bash est ce qu'on appele une forkbomb. Autrement dit, un "programme" qui ne fait que se dupliquer. Mais qui le fait bien. Je suis tombé dessus récemment, sous une forme alternative. Et sur le coup, j'ai été bien incapable d'en comprendre le mode de fonctionnement, je la lisais littéralement. On m'a éclairé (merci à Jean-Philippe et à Julien, qui se reconnaîtront si ils passent par là).

Décortiquons la mienne (je la trouve plus esthétique, mais c'est purement subjectif) :

```
:(){ :|:& };:
```

:{} n'est ni plus ni moins qu'une déclaration de fonction en bash. La fonction s'appele ':', tout simplement (pour info, j'ai appris au passage que ':' en bash correspond à la fonctione NOOP, celle qui... ne fait rien ;) ). Ce qui suit, entre accolades, est le code de la fonction :  :|:& . Que fait-elle cette fonction ? Elle se relance elle-même (le premier ':'), et si jamais elle n'y arrive pas (c'est le test '|'), et bien elle se relance encore, mais en arrière plan cette fois (c'est ':&'). Enfin, le point-virgule sert, en bash, à enchaîner plusieurs commandes sur la même ligne : ici il sert à lancer la fonction juste après l'avoir déclarée. Sur un PC puissant, l'effet est instantané.

----------

## man in the hill

Superbe explication Anigel   :Cool: 

----------

## geekounet

 *anigel wrote:*   

> Décortiquons la mienne (je la trouve plus esthétique, mais c'est purement subjectif) :
> 
> ```
> :(){ :|:& };:
> ```
> ...

 

Heu, le | c'est un pipe et le "ou logique" c'est || si je me trompe pas. Donc : se lance simplement 2 fois en même temps.Last edited by geekounet on Fri Feb 09, 2007 8:51 pm; edited 1 time in total

----------

## kwenspc

+1 geekounet. Le pipe permet ici d'augmenter le nombre de fonction ":" lancé, en demandant en plus de se détacher du processus père (d'où la difficulté de tuer les processus fils du même coup). Fin perso je le vois comme ça.

[edit]

petite précision: on aurait très bien pu faire 

```
:(){ :& }; :
```

  qui serait l'expression la plus simple pour arriver à ses fins. ou sinon plus bourrin: 

```
:(){ :|:|:|:|:|:& }; :
```

  Le pipe permet de rediriger l'exécution de la fonction ":", là je comprends pas trop d'ailleurs: en principe on utilise le pipe pour rediriger un flux en sortie afin qu'il devienne un flux en entrée à la commande suivante. mais vu que ":" ne gère aucun flux en entrée... Donc je pense que c'est une manière de parallelisé l'execution de ":" comme l'a noté geekounet pour en avoir plus. D'où la possibilité de multiplier les pipes comme on veut. Ah sinon le & ça met la fonction en background. On détache le fils du père, ça permet une multiplication des instances indépendantes. Essayez:  

```
:(){ :;}; :
```

  avec un ulimit de 10 process ça passe quand même. faudrait faire un script plus complet qui affiche les pid et aussi quand un pid meurt. à mon avis sans le & les père meurent (regardez avec top, la mémoire n'augmente pas: preuve que les process sont pas duppliqués indéfiniment, on reste à un nombre constant de processus présents. Cependant la boucle continue, d'où une occupation cpu à fond).

Du coup je me demande si le pipe n'est pas là pour faire "durer" le process. Dans le sens ou le premier ":" envoi sa sortie (qui n'existe pas) au second ":" qui est détaché, ce dernier attend du coup indéfiniment une entrée de la part du premier mais qui ne vient pas. 

Vous en pensez quoi?  :Neutral: 

[/edit]

----------

## razer

Je m'incruste dans ce post pour demander une solution éclairée pour le néophite, je suppose n'être pas seul au monde : si ulimit est inefficace, on peut faire quoi pour lui faire la peau à ce truc ?

----------

## anigel

 *man in the hill wrote:*   

> Superbe explication Anigel  

 

Merci, mais la gloire ne m'en revient pas : ce sont les 2 personnes que j'ai citées qui sont à féliciter. D'autant que j'ai fait une erreur de lecture, que geekounet a corrigé (merci  :Wink:  ).

@geekounet : je trouve le script d'origine plus efficace que ta proposition (  :Sad: ){ :& }; : ). Dans le script d'origine, le fait de lancer 2 fois la fonction, emboîtée l'une dans l'autre, permet, pour chacune d'elle, de relancer 2 processus : on est face à une croissance exponentielle (que les matheux me corrigent si le terme est impropre). Dans le cas d'une seule relance, nous sommes face à une récursivité "simple".

Ahhh, les joies de la récursivité. Des générations d'étudiants qui plantent leur machine parcequ'ils n'ont pas suivi les consignes. Et avant, des générations d'admins qui rebootaient des serveurs, faute d'avoir été mis au courant que le TP comprenait des fork()  :Wink:  !

EDIT : @ razer, heureusement, ulimit est efficace !

----------

## Delvin

Ca me rappel à l'iut, un prof s'etait servi de cat pour créer un fichier de 900 mega en à peine quelques secondes

un truc genre cat machin >>machin ou quelque chose comme ça, à l'époque cat ne regardait pas si le fichier en entrée etait le même qu'en sortie

----------

## Temet

 *nemo13 wrote:*   

> >> temet 
> 
> tu as mal lu :
> 
>  *Babali wrote:*   Je veux vraiment empecher un utilisateur de pomper tout le cpu et de saturer une machine.
> ...

 

Bon, mea culpa.

Je présente mes excuses pour avoir lu en diagonale.

(j'étais vénère sur le coup)

----------

## Babali

@Temet: navre. J'aurais du le mettre en rouge et gras. Ce que je vais faire.

Comme quoi on est tous concerne par ce probleme  :Wink: 

Le probleme avec les `:' c'est  que si tu lances un shell POSIX genre bash --posix, ca ne passe pas car `:' ne fais pas partit des identifiants valides.

----------

## Temet

Sois pas navré, c'est entièrement ma faute.

C'est moi qui suis navré par ma réaction  :Embarassed:  ... et j'avoue que j'étais tellement intrigué par ces quelques caractères ... enfin bref. Y a pas eu de casse  :Wink: 

Merci de ne pas m'en vouloir.

----------

## kaworu

 *anigel wrote:*   

>  *kaworu wrote:*   waaa, la belle bleue ! 
> 
> En voilà un qui n'a pas écouté les mises en garde .
> 
> 

 

plop

En faite je connaissais déjà bien la forkbomb sous la forme  

```
:(){:|:&};:
```

 en Bash (d'ailleur on peut faire des forkbomb en presque n'importe quoi), je pensais pas que mon commentaire pousserais des gentooïste à tenter l'expérience. Mea culpa.

----------

## El_Goretto

 *kaworu wrote:*   

> je pensais pas que mon commentaire pousserais des gentooïste à tenter l'expérience.

 

Comment dire....

Cette phrase... elle se contredit toute seule ^^

----------

## mornik

Toujours fun d'essayer des trucs qui, on le sait par avance, vont faire krasher la machine :p

J'avoue avoir été tres tenté d'essayer. Voir coment ma machine se bloquait. Totalement inutile, mais simplement cartoon :p

----------

## nemo13

 *El_Goretto wrote:*   

>  *kaworu wrote:*   je pensais pas que mon commentaire pousserais des gentooïste à tenter l'expérience. 
> 
> Comment dire....
> 
> Cette phrase... elle se contredit toute seule ^^

 

 :Rolling Eyes:  antinomique   :Question: 

----------

