secuencia de bash:Espere la salida y luego inicie el siguiente programa.
Pregunta
En mi caso tengo que correr openvpn
antes de ingresar a un servidor, y el openvpn
El comando repite "Secuencia de inicialización completada".
Entonces, quiero que mi script configure el openvpn
y luego ingresa ssh.
Mi pregunta es:¿Cómo se ejecuta un comando en bash en segundo plano y se espera que diga "completado" antes de ejecutar otro programa?
Mi forma actual de hacer esto es tener 2 paneles de terminal abiertos, uno ejecutando:
sudo openvpn --config FILE
y en el otro corro:
ssh SERVER
una vez que el primer panel de terminal me mostró el texto "Secuencia de inicialización completada".
Solución
Parece que quieres ejecute openvpn como un proceso en segundo plano mientras procesa su salida estándar en primer plano.
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
Explicación
Rompamoslo en pedazos:
echo <(sudo openvpn --config FILE)
imprimirá algo como/dev/fd63
- el
<(..)
carreras openvpn en el fondo y... - adjunta su salida estándar a un descriptor de archivo, que se imprime mediante
echo
- el
exec 3< /dev/fd63
- (dónde /dev/fd63 es el descriptor de archivo impreso desde el paso 1)
- esto le dice al shell que abra el descriptor de archivo (/dev/fd63) para leer, y...
- ponerlo a disposición en el descriptor de archivo
3
sed '/Initialization Sequence Completed$/q' <&3
- ahora corremos sed en primer plano, pero haz que se lea desde el descriptor del archivo
3
acabamos de abrir - tan pronto como sed ve que la línea actual termina con "Secuencia de inicialización completada", sale (el /q parte)
- ahora corremos sed en primer plano, pero haz que se lea desde el descriptor del archivo
cat <&3 &
- openvpn Seguirá escribiendo en el descriptor del archivo.
3
y eventualmente bloquear si no se lee nada - para evitar eso, corremos gato en segundo plano para leer el resto de la salida
- openvpn Seguirá escribiendo en el descriptor del archivo.
La idea básica es ejecutar openvpn
en segundo plano, pero captura su salida en algún lugar para que podamos ejecutar un comando en primer plano que se bloqueará hasta que lea las palabras mágicas "Secuencia de inicialización completada".El código anterior intenta hacerlo sin crear archivos temporales desordenados, pero una forma más sencilla podría ser simplemente utilizar un archivo temporal.
Otros consejos
Usar -m 1
Juntos con --line-buffered
en grep para finalizar un grep después de la primera coincidencia en una secuencia continua.Esto debería funcionar:
sudo openvpn --config FILE | grep -m "Initialization Sequence Completed" --line-buffered && ssh SERVER