Como posso encerrar um processo após uma saída específica desse processo? Por exemplo, executando um programa Java com java -jar xyz.jar
, desejo encerrar o processo assim que a linha "Servidor iniciado na porta 8000" aparecer no stdout.
Responder1
Isso pode ser feito com o seguinte script, considerando que grep -m1
não funciona para você:
#!/bin/bash
java -jar xyz.jar &> "/tmp/yourscriptlog.txt" &
processnumber=$!
tail -F "/tmp/yourscriptlog.txt" | awk '/Started server on port 8000/ { system("kill '$processnumber'") }'
Basicamente esse script redireciona o stdout
seu código java para um arquivo com o comando &> "/tmp/yourscriptlog.txt"
, o último &
da primeira linha faz seu código rodar como um processo isolado e na linha seguinte temos o número desse processo com $!
. Tendo o número do processo e um arquivo de log tail
podemos finalmente encerrar o processo quando a linha desejada for impressa.
Responder2
java -jar xyz.jar | grep -m1 "Started server on port 8000"
Responder3
Ajustei a resposta do @Rafael para ocasiões mais complicadas como a minha, onde o script não se deixa simplesmente ficar em segundo plano.
Abra uma primeira tmux
sessão e coloque seu comando (use tee
em vez de redirecionamento para ver a saída ao vivo), depois desconecte com Ctrl-B D:
java -jar xyz.jar &> '/var/log/myscript.log'
Em outra sessão do tmux, lide com o encerramento:
tail -F '/var/log/myscript.log' | awk '/Started server on port 8000/ { system("tmux kill-session -t 0") }'
Use uma sessão nomeada se você já tiver outras sessões do tmux em execução.