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.

Était-ce utile?

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:

  1. 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
  2. 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
  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)
  4. 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

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top