Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
Vieux 04/01/2010, 13h00   #1
Rédacteur
 
Avatar de Arnaud F.
 
Homme Arnaud Feltz
Développeur .NET
Inscription : août 2005
Messages : 5 213
Détails du profil
Informations personnelles :
Nom : Homme Arnaud Feltz
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur .NET
Secteur : Transports

Informations forums :
Inscription : août 2005
Messages : 5 213
Points : 6 122
Points : 6 122
Par défaut [Fork] Exécuter des commandes en parallèle

Bonjour,

j'ai une petite question pratique shellscript, j'ai ceci :
Code :
1
2
3
4
5
6
 
for server in $(cat servers.list)
do
#Connexion au serveur SQL et recherche de resultat
#Traitement du resultat
done
Ce code est exécuté sur plusieurs serveurs (une bonne quinzaine) et de manière itérative, donc c'est très long...

J'aimerai pouvoir "forker" le contenu de la boucle mais je ne sais pas comment faire... Des idées?

__________________
C'est par l'adresse que vaut le bûcheron, bien plus que par la force. Homère

Installation de Code::Blocks sous Debian à partir de Nightly Builds
Arnaud F. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2010, 13h14   #2
Expert Confirmé
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 1 897
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 1 897
Points : 3 677
Points : 3 677
Bonjour Arnaud,

cuuoc (common useless use of cat)

ainsi :
Code non-testé :
1
2
3
4
5
6
7
8
yourFunc() {
serveur=$1
#Connexion au $serveur SQL et recherche de resultat
#Traitement du resultat
}
while read line; do
   yourFunc "$line" &
done < servers.list
...
?
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2010, 13h17   #3
Rédacteur
 
Avatar de Arnaud F.
 
Homme Arnaud Feltz
Développeur .NET
Inscription : août 2005
Messages : 5 213
Détails du profil
Informations personnelles :
Nom : Homme Arnaud Feltz
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur .NET
Secteur : Transports

Informations forums :
Inscription : août 2005
Messages : 5 213
Points : 6 122
Points : 6 122
Je venais de trouver la réponse en même temps

Je confirme que ça fonctionne bien !

Par contre, petite chose, comment je fais pour savoir quand toutes les instances que j'ai lancée en arrière plan sont finies?

Parce que du coup j'ai de nouveau le prompt SH alors que j'ai des fonctions qui tournent toujours

de m'aider à élucider ce dernier petit détail
__________________
C'est par l'adresse que vaut le bûcheron, bien plus que par la force. Homère

Installation de Code::Blocks sous Debian à partir de Nightly Builds
Arnaud F. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2010, 13h35   #4
Rédacteur
 
Avatar de Arnaud F.
 
Homme Arnaud Feltz
Développeur .NET
Inscription : août 2005
Messages : 5 213
Détails du profil
Informations personnelles :
Nom : Homme Arnaud Feltz
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur .NET
Secteur : Transports

Informations forums :
Inscription : août 2005
Messages : 5 213
Points : 6 122
Points : 6 122
J'ai fais un truc du genre :

Code :
1
2
3
4
5
6
7
8
9
10
11
for server in $(cut -f1 -d' ' servers.list)
do
    doIt $server&;
done
 
while (( $(ps|grep $0|wc -l|awk '{print $1}') > 1 ))
do
    sleep 1;
done
 
sleep 1;
Ça fonctionne mais je pense néanmoins que ça doit être très perfectible
__________________
C'est par l'adresse que vaut le bûcheron, bien plus que par la force. Homère

Installation de Code::Blocks sous Debian à partir de Nightly Builds
Arnaud F. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2010, 14h05   #5
Expert Confirmé
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 1 897
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 1 897
Points : 3 677
Points : 3 677
Code :
1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash

while read server reste; do
    doIt $server &
done <servers.list

while [ $(wc -l <<<"$(grep $0 <(ps -ef))") -gt 1 ] # ou utiliser "$(pgrep $0)"
do sleep 1
done

sleep 1

Dernière modification par N_BaH ; 04/01/2010 à 15h46.
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2010, 19h13   #6
Rédacteur
 
Avatar de Arnaud F.
 
Homme Arnaud Feltz
Développeur .NET
Inscription : août 2005
Messages : 5 213
Détails du profil
Informations personnelles :
Nom : Homme Arnaud Feltz
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur .NET
Secteur : Transports

Informations forums :
Inscription : août 2005
Messages : 5 213
Points : 6 122
Points : 6 122
__________________
C'est par l'adresse que vaut le bûcheron, bien plus que par la force. Homère

Installation de Code::Blocks sous Debian à partir de Nightly Builds
Arnaud F. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2010, 19h25   #7
Membre régulier
 
Christophe LE FLOCH
Inscription : août 2009
Messages : 105
Détails du profil
Informations personnelles :
Nom : Christophe LE FLOCH
Âge : 37

Informations forums :
Inscription : août 2009
Messages : 105
Points : 90
Points : 90
Bonjour,

Avec la commande wait, ce ne serait pas plus simple ? Cette commande attend que tous les jobs d'arrière plan se soient terminé.
mongolic est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2010, 19h47   #8
Rédacteur
 
Avatar de Arnaud F.
 
Homme Arnaud Feltz
Développeur .NET
Inscription : août 2005
Messages : 5 213
Détails du profil
Informations personnelles :
Nom : Homme Arnaud Feltz
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur .NET
Secteur : Transports

Informations forums :
Inscription : août 2005
Messages : 5 213
Points : 6 122
Points : 6 122
Citation:
Envoyé par mongolic Voir le message
Bonjour,

Avec la commande wait, ce ne serait pas plus simple ? Cette commande attend que tous les jobs d'arrière plan se soient terminé.
Pfff trop simple

J'ai testé, ça fonctionne bien en effet

Merci !
__________________
C'est par l'adresse que vaut le bûcheron, bien plus que par la force. Homère

Installation de Code::Blocks sous Debian à partir de Nightly Builds
Arnaud F. est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +1. Il est actuellement 04h10.


 
 
 
 
Partenaires

Hébergement Web