Eu tenho um servidor de IC com uma interface de linha de comando que permite iniciar remotamente um trabalho ( jenkins
servidor de CI e a jenkins-cli.jar
ferramenta).
Depois de iniciar o trabalho tail -f
no log (desculpe pelo comando confuso):
ssh -t my-jenkins-host.com "tail -f \"/var/lib/jenkins/jobs/$job_name/builds/\`ls -ltr /var/lib/jenkins/jobs/$job_name/builds/ | grep '^l' | tail -n 1|awk '{print \$9}'\`/log\""
Depois que o trabalho é concluído com êxito, geralmente após pelo menos 5 minutos, recebo a seguinte linha na saída:
Finished: SUCCESS
Existe uma boa maneira de parar de seguir o log neste momento? ou seja, existe como um tail_until 'some line' my-file.log
comando?
BÔNUS: crédito extra, se você puder fornecer uma resposta que retorne 0 quando o SUCESSO corresponder, 1 quando o FAILURE corresponder e sua solução funcionar no mac! (que eu acredito que é baseado em bsd)
q
comando usará um código de saída opcional. Então osed
comando seriased '/^Finished: SUCCESS$/ q0; /^Finished: FAILURE$/ q1'
Finished: SUCCESS
for a última linha de saída-q
, ou seja, silencioso, sai assim que encontra uma correspondência-x
fazgrep
corresponder a linha inteiraPara a segunda parte, tente
-m <number>
diz ao grep para parar após a correspondência de númerose o
grep -q
status de saída será apenas0
seSUCCESS
for encontrado no final da linhaSe você deseja ver toda a saída, não pode usar
grep -q
, mas ainda pode fazerque faz tudo, exceto define o status de saída para 1 se
FAILURE
aparecer.fonte
grep
na minha resposta originalmente, mas se ele estiver usando,tail -f
ele provavelmente quer ver a saída do arquivo;grep
não mostrará todas as linhas intermediárias #Uma variação da resposta de @ Mikel nos comentários de @ Mrozek (eu teria respondido no comentário, mas acho que ainda não tenho privilégios suficientes)
permitiria que você usasse a solução do @ Mikel e ainda visse a saída na tela
fonte
Eu não gostei de nenhuma das respostas aqui, então decidi rolar as minhas. Esse script bash atende a todos os critérios e inclui o BÔNUS para a saída 1 em caso de falha.
Também está incluído um recurso de tempo limite, que resultará em um código de saída 3. Se você não tiver o comando timeout no sistema, pegue o script timeout.sh de Anthony Thyssen:
http://www.ict.griffith.edu.au/anthony/software/timeout.sh
Pelos comentários abaixo, atualizei a impressão do log para interromper a expansão de caracteres de escape e incluí todos os recursos de uma 'leitura' padrão. Consulte /programming//a/10929511 para obter detalhes completos de 'leitura'. A verificação EOF não é necessária aqui, mas está incluída para garantir a integridade.
fonte
while IFS= read -r LOGLINE
para impedir que o shell execute a divisão de espaço em branco nas linhastail
.read
não se divide quando há apenas uma variável (e não é uma matriz com-a
), mas você precisa-r
se os dados de entrada contiverem barra invertida. Mas, se os dados de entrada contém barra invertida, entãoecho "$var"
também pode estragar dependendo da sua concha e / ou sistema, então é melhorprintf '%s\n' "$line"
aqui está um script python que quase faz o que eu quero (veja advertências abaixo):
ressalvas:
as linhas não são impressas quando entram ... elas são impressas em grupos ... parece haver algum buffer acontecendo
eu teria que instalar isso como um script no meu caminho ou algo assim, por isso é inconveniente, e eu preferiria uma linha única :)
fonte
tail
parece fazer o mesmo buffer, então acho que não vale a pena tentar contornar isso.Eu tive problemas com
sed
egrep
e suas opções, então escrevo o meuone with bash conditions
fonte
Você também tenta
fonte