bash séquence:attendre pour la sortie, puis démarrer le programme suivant
Question
Dans mon cas, je dois courir openvpn
avant de ssh qui pratiquent dans un serveur, et le openvpn
commande echos de "Séquence d'Initialisation Terminée".
Donc, je veux que mon script pour l'installation de l' openvpn
et puis ssh en.
Ma question est:Comment exécuter une commande de bash en arrière-plan et l'attendent pour echo "terminé" avant d'exécuter un autre programme?
Ma façon de le faire est d'avoir 2 terminal volets ouverts, en cours d'exécution:
sudo openvpn --config FILE
et dans l'autre j'ai exécuter:
ssh SERVER
une fois que le premier terminal volet m'a montré la "Séquence d'Initialisation Terminée" du texte.
La solution
Il semble que vous voulez exécuter openvpn comme un processus en arrière-plan pendant le traitement de sa sortie standard (stdout) dans le premier plan.
exec 3< <(sudo openvpn --config FILE)
sed '/Initialization Sequence Completed$/q' <&3 ; cat <&3 &
# VPN initialization is now complete and running in the background
ssh SERVER
Explication
Nous allons briser en morceaux:
echo <(sudo openvpn --config FILE)
permet d'imprimer quelque chose comme/dev/fd63
- l'
<(..)
fonctionne openvpn dans le fond, et... - attache son stdout vers un descripteur de fichier, qui est imprimé par
echo
- l'
exec 3< /dev/fd63
- (où /dev/fd63 est le descripteur de fichier imprimé à partir de l'étape 1)
- cela indique au shell pour ouvrir le fichier descripteur (/dev/fd63) pour la lecture, et...
- rendre disponible sur le descripteur de fichier
3
sed '/Initialization Sequence Completed$/q' <&3
- maintenant, nous courons sed au premier plan, mais il est lu à partir du descripteur de fichier
3
nous venons d'ouvrir - dès que sed voit que la ligne en cours se termine par "Séquence d'Initialisation Terminée", il se ferme (la /q partie)
- maintenant, nous courons sed au premier plan, mais il est lu à partir du descripteur de fichier
cat <&3 &
- openvpn gardera l'écriture dans le fichier descripteur de
3
et finalement bloquer si rien de lit à partir de ce - pour éviter cela, nous courons chat dans le fond de lire le reste de la sortie
- openvpn gardera l'écriture dans le fichier descripteur de
L'idée de base est de courir openvpn
dans le fond, mais la capture de sa sortie quelque part afin que nous puissions exécuter une commande dans le premier plan qui permet de bloquer jusqu'à ce qu'il lit les mots magiques, "Séquence d'Initialisation Terminée".Le code ci-dessus tente de le faire sans créer de désordre fichiers temporaires, mais d'une façon plus simple peut-être juste utiliser un fichier temporaire.
Autres conseils
Utilisation -m 1
avec --line-buffered
dans grep pour mettre fin à un grep après le premier match dans un flux continu.Cela devrait fonctionner:
sudo openvpn --config FILE | grep -m "Initialization Sequence Completed" --line-buffered && ssh SERVER