Contenu | Rechercher | Menus

Annonce

Ubuntu-fr.org recrute toujours de nouveaux modérateurs, avec de l'expérience.

Ubuntu 16.04 LTS
Réservez vos DVD et clé USB Ubuntu-fr (premières livraisons mi-mai)

Si vous avez des soucis pour rester connecté, déconnectez vous et reconnectez vous depuis ce lien en cochant le case
Me connecter automatiquement lors de mes prochaines visites.

M.A.J. en cours du forum possibilité de bug, nous faisons le maximum pour les résoudre au plus vite

#1 Le 29/01/2013, à 13:38

wolf85kunst

Nourrir une boucle while avec une commande bash

Bonjour à tous,

Un exemple vaut mieux qu'un long discours :

#Calcul de la memoire totale utilisé par apache
# --------------------------------------------------------------
apache_ram=0
while read line
do
       apache_ram=$(($apache_ram+$line))
done <`ps aux |grep apache2 |grep -v grep |awk '{print $6}'`

Le script devrait stocker dans la variable apache_ram la mémoire vive totale utilisée par les processus apache2, mais j'ai le droit à un "ambiguous redirect"...

Je sèche sur ce problème...
Merci beaucoup^pour votre aide.

Dernière modification par wolf85kunst (Le 29/01/2013, à 13:52)


Les raisonnables ont duré, les passionnés ont vécu.
-- 10.04 Lucid Lynx --

Hors ligne

#2 Le 29/01/2013, à 13:53

wolf85kunst

Re : Nourrir une boucle while avec une commande bash

Et la correction :

#Calcul de la memoire totale utilisé par apache
# --------------------------------------------------------------
apache_ram=0
while read line
do
#       echo $line
        apache_ram=$(($apache_ram+$line))
done < <(ps aux |grep apache2 |grep -v grep |awk '{print $6}')

Les raisonnables ont duré, les passionnés ont vécu.
-- 10.04 Lucid Lynx --

Hors ligne

#3 Le 29/01/2013, à 13:54

Watael

Re : Nourrir une boucle while avec une commande bash

salut,

Ce que tu cherches, c'est la substitution de processus: <(commande), qui doit être rédirigée

while read line; do echo "$line"; done < <(commande)

pour ton problème, il y a plus simple

$ RSSapache2=( $(pgrep apache2) )
$ RSStotal=$(IFS='+'; echo $(( ${RSSapache2[*]} )) )
$ echo $RSStotal

Dernière modification par Watael (Le 29/01/2013, à 13:54)


eval, c'est mal.

Hors ligne

#4 Le 29/01/2013, à 14:19

wolf85kunst

Re : Nourrir une boucle while avec une commande bash

Merci pour ce complément.
Effectivement, la substitution répond mieux à cette problématique !

Dernière modification par wolf85kunst (Le 29/01/2013, à 14:20)


Les raisonnables ont duré, les passionnés ont vécu.
-- 10.04 Lucid Lynx --

Hors ligne

#5 Le 30/01/2013, à 02:42

nesthib

Re : Nourrir une boucle while avec une commande bash

Pour expliciter le besoin du double chevron, la syntaxe <(…) crée en fait un fichier virtuel (un pipe) contenant le retour de la commande entre les parenthèses. Celui-ci peut être accédé comme un fichier normal par la commande qui l'utilise. Un exemple simple pour s'en rendre compte est de lancer par exemple :

ls -l <(cat)

ce qui devrait retourner quelque chose du genre :

lr-x------ 1 user group date /proc/self/fd/11 -> pipe:[123456]

où l'on voit que « <(cat) » est substitué par « /proc/self/fd/11 ».

La syntaxe :

commande < <(…)

revient donc à faire la redirection classique :

commande <fichier

sauf qu'ici le fichier est virtuel et créé par ton shell.

En espérant que ça soit plus clair smile


ps. le « ps aux |grep apache2 |grep -v grep |awk '{print $6}' » peut avantageusement être remplacé par « ps aux | awk '/[a]pache2/{print $6}' »

pps. si tu veux faire la somme des nombres retournés, tu peux encore plus avantageusement faire :

ps aux | awk '/[a]pache2/{s+=$6}END{print s}'

et bien entendu faire toute sorte de calculs et/ou formatages :

ps aux | LOCALE=fr_FR.UTF-8 awk --posix '/[a]pache2/{s+=$6}END{printf "%.2f Mo\n", s/1024}'

GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne