Encerre o processo após uma saída específica

Encerre o processo após uma saída específica

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 -m1nã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 stdoutseu 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 tailpodemos 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 tmuxsessão e coloque seu comando (use teeem 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.

informação relacionada