#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
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 : Giroll – Services libres : TdCT.org
Hide in your shell, scripts & astuces : applications dans un tunnel – smart wget – trouver des pdf – install. auto de paquets – sauvegarde auto – ♥ awk
⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn
Hors ligne