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". Attention, le forum rencontre actuellement quelques difficultés. En cas d'erreur 502, il ne faut pas re-valider l'envoi d'un message ou l'ouverture d'une discussion, au risque de créer un doublon.

La section divers se réorganise ! De nouvelles sous-sections à venir. (plus d'infos + donner son avis)

#1 Le 29/01/2013, à 12: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, à 12:52)


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

Hors ligne

#2 Le 29/01/2013, à 12: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, à 12: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, à 12:54)


eval, c'est mal.

En ligne

#4 Le 29/01/2013, à 13: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, à 13:20)


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

Hors ligne

#5 Le 30/01/2013, à 01: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

Haut de page ↑