#1 Le 08/11/2008, à 02:21
- lezardo
Comment attendre le lancement complet d'un processus dans un shell?
Bonjour à tous,
Je suis en train d'essayer de créer un script pour configurer facilement et rapidement son pda mais je rencontre quelque difficultés....
Dans mon script je dois lancer synce-sync-engine, et puis une fois qu'il est lancé seulement configurer le partenariat avec synce-create-partnership "pda" "Contacts,Calendar,Tasks,Files"...
Après un peu de recherche, toutes les pistes m'indiquent d'utiliser la commande wait après avoir lancé synce-sync-engine mais cela ne semble toujours pas marcher et il semblerait que cette commande attente la mort du processus lancé préalablement?
Comment dès lors dois-je faire pour attendre la chargement complet de synce-sync-engine???
En vous remerciant d'avance...
Simon
#2 Le 08/11/2008, à 12:02
- Totor
Re : Comment attendre le lancement complet d'un processus dans un shell?
Une solution serait de vérifier l'état du processus. C'est à dire en attendant qu'il ne soit plus à l'état R (Running). En effet, une fois qu'ils sont chargés et inactifs, les processus ont l'état S (Sleeping)
Mais ce n'est pas une totale garantie car la phase de chargement peut aussi avoir des états d'attente donc l'état S pour le processus !
#!/bin/bash
attendreFinChargement()
{
numPID=$1
while [ "$(ps --pid ${numPID} -o state --no-headers)" == "R" ]; do
sleep 1
done;
}
synce-sync-engine &
attendreFinChargement $$
Par ailleurs, cela ne fonctionne pas si le process lance un autre process et se termine ensuite. Pour exemple : ooffice.
-- Lucid Lynx --
Hors ligne
#3 Le 08/11/2008, à 12:26
- Link31
Re : Comment attendre le lancement complet d'un processus dans un shell?
Le moyen standard pour faire ça est de faire afficher un message par le processus quand il est prêt. On peut récupérer ce message depuis un script shell et lancer d'autres programmes au bon moment.
Sinon, il y a d'autres moyens, mais tous sont peu fiables. Par exemple :
- attendre tout simplement quelques secondes avec un "sleep"
- lancer le processus, l'attacher sous "strace", et analyser la sortie de strace pour déterminer à quel moment le processus est prêt. Puis détacher le processus de strace. Attention, cela risque de ralentir très fortement l'exécution du programme pendant qu'il est lié à strace.
Hors ligne
#4 Le 08/11/2008, à 14:01
- lezardo
Re : Comment attendre le lancement complet d'un processus dans un shell?
Un grand merci à vous deux Link31 et Totor, je vais tenter la méthode de Totor et vous tiendrai au courant du résultat...
Le moyen standard pour faire ça est de faire afficher un message par le processus quand il est prêt. On peut récupérer ce message depuis un script shell et lancer d'autres programmes au bon moment.
Une idée de comment on peux faire cela??? Désolé pour mon incompétence mais je débute... Ce script sera bien sûre diffusé par la suite ;-)
Bonne journée à tous!
#5 Le 08/11/2008, à 14:39
- Link31
Re : Comment attendre le lancement complet d'un processus dans un shell?
Une idée de comment on peux faire cela??? Désolé pour mon incompétence mais je débute... Ce script sera bien sûre diffusé par la suite ;-)
une_commande | while read line
do
if [[ "$line" == "un certain message" ]]
then
# faire quelque chose...
fi
done
Si le programme n'affiche pas de message permettant de savoir qu'il est prêt, alors il suffit de le modifier (le code n'est pas ouvert pour rien ).
Hors ligne
#6 Le 08/11/2008, à 16:12
- lezardo
Re : Comment attendre le lancement complet d'un processus dans un shell?
Merci Link31 pour ta réponse rapide....
Malheureusement il affiche beaucoup trop de messages a mon gout et mon script devient dès lors totalement illisible....
Je crois que la solution que je vais adopter avec regret est de demander à l'utilisateur de lancer lui même synce-sync-engine et d'appuyer sur une touche quand c'est lancé....
Encore un grand merci pour votre aide et n'hésitez pas si vous avez d'autres pistes de solution ;-)
Simon