Contenu | Rechercher | Menus

Annonce

Si vous rencontrez des soucis à rester connecté sur le forum (ou si vous avez perdu votre mot de passe) déconnectez-vous et reconnectez-vous depuis cette page, en cochant la case "Me connecter automatiquement lors de mes prochaines visites".
Test de l'ISO d'Ubuntu francophone : nous avons besoin de testeurs pour la version francophone d'Ubuntu 14.04. Liens et informations ici.

#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ᴉsdnGMT-4

Hors ligne

Haut de page ↑