bash sequência:aguarde pela saída, em seguida, iniciar o programa seguinte
Pergunta
No meu caso, eu tenho que correr openvpn
antes de ssh ing em um servidor, e o openvpn
comando ecos fora "Seqüência de Inicialização Concluída".
Então, eu quero o meu script para a instalação openvpn
e, em seguida, o ssh.
A minha pergunta é:Como você executar um comando no bash no plano de fundo e aguardam para echo "concluído" antes de executar outro programa?
Minha atual forma de fazer isso é ter de terminal de 2 painéis abertos, um em execução:
sudo openvpn --config FILE
e no outro eu executar:
ssh SERVER
uma vez que o primeiro terminal painel mostrou-me a "Seqüência de Inicialização Concluída" de texto.
Solução
Parece que você quer executar o openvpn como um processo em segundo plano durante o processamento de seu stdout em primeiro 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
Explicação
Vamos quebrá-lo em pedaços:
echo <(sudo openvpn --config FILE)
irá imprimir algo como/dev/fd63
- o
<(..)
corre openvpn no fundo, e... - anexa a sua stdout para um arquivo descritor, que é impresso pela
echo
- o
exec 3< /dev/fd63
- (onde /dev/fd63 é o descritor de arquivo impresso a partir do passo 1)
- isso informa ao shell para abrir o arquivo descritor (/dev/fd63) para a leitura, e...
- torná-lo disponível no arquivo de descritor de
3
sed '/Initialization Sequence Completed$/q' <&3
- agora estamos sed em primeiro plano, mas fazer com que ele leia do arquivo de descritor de
3
que acabou de abrir - assim que sed vê-se que a atual linha termina com "Seqüência de Inicialização Concluída", ele fecha (o /q parte)
- agora estamos sed em primeiro plano, mas fazer com que ele leia do arquivo de descritor de
cat <&3 &
- openvpn vai continuar a escrever para o arquivo de descritor de
3
e, eventualmente, bloquear, se nada lê-lo - para evitar isso, execute as gato no plano de fundo para ler o resto da saída
- openvpn vai continuar a escrever para o arquivo de descritor de
A idéia básica é executar openvpn
no plano de fundo, mas a captura de sua saída em algum lugar para que possamos executar um comando em primeiro plano que irá bloquear até que ele lê as palavras mágicas, "Seqüência de Inicialização Concluída".O código acima tenta fazê-lo sem criar confuso arquivos temporários, mas de uma maneira mais simples, pode ser apenas para usar um arquivo temporário.
Outras dicas
Utilização -m 1
em conjunto com --line-buffered
em grep para terminar um grep após a primeira partida, em um fluxo contínuo.Isso deve funcionar:
sudo openvpn --config FILE | grep -m "Initialization Sequence Completed" --line-buffered && ssh SERVER