2011-08-25 5 views
2

Je ne suis pas familier avec Linux Shell Scripting et je me demandais si quelqu'un pouvait m'aider avec ce qui suit.Comment créer un script pour exécuter plusieurs commandes "exec" séquentiellement?

J'ai créé un script pour synchroniser le temps avec ma machine linux, mais une seule commande exec semble compléter

#!/bin/bash 
#Director SMS Synch Time Script 

echo The current date and time is: 
date 
echo 

echo Synching GTS Cluster 1 directors with SMS. 
echo 
echo Changing date and time for director-1-1-A 
exec ssh [email protected] "ntpd -q -g" 
echo Finished synching director-1-1-A 
echo 

sleep 2 

echo Changing date and time for director-1-1-B 
exec ssh [email protected] "ntp -q -g" 
echo Finished synching director-1-1-B 
echo 

sleep 2 

echo Finished Synching GTS Cluster 1 directors with SMS. 
sleep 2 
echo 
echo Synching SVT Cluster 2 directors with SMS. 
echo 
echo Changing date and time for director-2-1-A 
exec ssh [email protected] "ntpd -q -g" 
echo Finished synching director-2-1-A 
echo 

sleep 2 

echo Changing date and time for director-2-1-B 
exec ssh [email protected] "ntpd -q -g" 
echo Finished synching director-2-1-B 
echo 

sleep 2 

echo Changing date and time for director-2-2-A 
exec ssh [email protected] "ntpd -q -g" 
echo Finished synching director-2-2-A 
echo 

sleep 2 

echo Changing date and time for director-2-2-B 
exec ssh [email protected] "ntpd -q -g" 
echo Finished synching director-2-2-B 

sleep 2 

echo 

echo 
echo Finished Synching SVT Cluster 2 directors with SMS. 

Le script semble seulement après la première complète commande exec.

jeu 25 août 12:40:44 EDT 2011

Synching GTS Cluster 1 avec les administrateurs SMS.

Modification de la date et l'heure pour le directeur-1-1-A

Toute aide serait grandement appréciée =)

+0

L'homme expliquera pourquoi cela se produit. se débarrasser de l'exec et vous devriez être en or. OTOH cela ressemble à un abus grave de ntpd ici! – fvu

+0

vous devez nous dire pourquoi vous avez besoin d'exec chaque ssh. ': g/exec/s/exec //' (supprime tous les execs et ça devrait marcher). Bonne chance. – shellter

+0

@fvu: 'man sh' est probablement un meilleur moyen de savoir ce que fait le' exec' intégré. – Jens

Répondre

7

Le point entier de exec est de remplacer le processus en cours. Dans les scripts shell cela signifie que le shell est remplacé et rien après le exec n'est plus exécuté. Ma conjecture sauvage est: peut-être que vous voulez mettre en arrière-plan les commandes avec & à la place (ssh ... &)?

Cependant, si vous voulez simplement exécuter les ssh en séquence, en attendant chaque fois que vous avez terminé, supprimez simplement les mots 'exec'. Il n'est pas nécessaire d'exprimer "Je veux exécuter this_command" avec exec. Juste this_command fera l'affaire.

Oh, et en faire un script #!/bin/sh; il n'y a pas de bashisme ou de linuxisme dans votre script. C'est une bonne pratique d'éviter les bashismes si vous le pouvez. De cette façon, votre script pourrait être exécuté non modifié si votre patron décide de passer, par exemple, à FreeBSD.

5

vous pouvez exécuter toutes les commandes, mais le dernier en arrière-plan, et le dernier avec exec:

par exemple si vous avez 4 commandes:

#!/bin/bash 

command1 & 
command2 & 
command3 & 

exec command4 

Processus arbre avant exec est exécuté:

bash       < your terminal 
    | 
    +----bash     < the script 
     | 
     +------command1 
     | 
     +------command2 
     | 
     +------command3 

Processus arbre après exec est exécuté:

bash       < your terminal 
    | 
    +------command4 
      | 
      +------command1 
      | 
      +------command2 
      | 
      +------command3 

Comme vous le voyez, la propriété des trois premières commandes est transférée à command4 lorsque le processus de bash pour le script est remplacé par commande4

Note:

Si les sorties Command4 avant les autres, les processus arbre devient :

init       < unix init process (PID 1) 
    | 
    +------command1 
    | 
    +------command2 
    | 
    +------command3 

Bien que la propriété devrait logiquement avoir été transférée au processus de terminal bash? Les mystères d'Unix ...

Questions connexes