2011-04-05 8 views
0

J'ai un simple script dire quelque chose test.sh comme ceci:sortie d'un script shell après fils de frai

#!/bin/sh 

for i in 0 1 2 3 4 5 
do 
ssh BOX someCommand& 
done 
exit 0 

Quand je lance le script, il génère 6 processus et renvoie le résultat à l'écran, mais après c'est fait il attend juste là. J'ai besoin de faire ctrl + c pour sortir. Le problème est que je ne peux pas appeler test.sh plusieurs fois dans un autre script, car il attendrait que le premier appel se termine indéfiniment. Aucune suggestion.

Merci

+1

Nitpicking votre terminologie; Les processus d'arrière-plan créés avec '&' ne sont pas des threads. –

+0

thnx Je l'ai changé – codeObserver

Répondre

4

Il ne fait quitter immédiatement. Votre problème est que le script quitte bientôt , avant que la sortie ne s'imprime à l'écran. Ainsi, la sortie écrase votre invite, et lorsque vous appuyez sur ctrl-c, elle redessine l'invite. Essayez d'ajouter une commande "wait" juste avant la sortie - le script ne se fermera pas tant que tous les processus SSH ne seront pas terminés.

Par "sortie rapide écrase votre" je veux dire:

  • Première: le script sort
  • Second: vos impressions rapides - "user @ ordinateur $" ou autre.
  • Troisièmement: toutes les sorties des commandes ssh s'impriment
  • A la fin vous êtes à gauche avec le curseur sur une ligne vierge sans invite, ce qui vous a fait penser qu'il ne s'est pas terminé. Puis, lorsque vous appuyez sur ctrl-c, l'invite s'imprime à nouveau.
+0

thnx pour la réponse. Ça a marché. Pouvez-vous clarifier sur "sortie écrase votre invite", ce n'est pas censé imprimer la sortie sur l'invite .. pourquoi l'écrase-t-il .. Je suppose que pour la même raison je ne comprends pas complètement comment l'attente a résolu le problème. – codeObserver

1

j'ai essayé quelque chose de similaire et le script correctement quitté

#!/bin/bash 

for i in 1 2 3 
do 
    ssh [email protected] "ls -l" & 
done 

echo "i am done" 

La seule différence est que j'utilise shell bash

1

Cela devrait fonctionner.

J'ai fait ce genre de travail, et la sortie peut être plutôt confuse. Combien de temps attendez-vous? Es-tu sûr que ce n'est pas vraiment fait?

Ajoutez banner done avant la sortie 0 et alors vous serez certain qu'il est vraiment accroché.

L'autre possibilité est que quelque chose à propos de someCommand ne finit pas vraiment. S'il s'agit d'un script que vous contrôlez, ajoutez un echo "someCommand on ${HOST} is finished" pour vous assurer que chacun d'eux est en cours de finition.