Terminar el proceso ante un resultado específico

Terminar el proceso ante un resultado específico

¿Cómo puedo finalizar un proceso tras un resultado específico de ese proceso? Por ejemplo, al ejecutar un programa Java con java -jar xyz.jar, quiero finalizar el proceso una vez que aparezca la línea "Servidor iniciado en el puerto 8000" en la salida estándar.

Respuesta1

Eso se puede lograr con el siguiente script considerando que grep -m1no funciona para usted:

#!/bin/bash

java -jar xyz.jar &> "/tmp/yourscriptlog.txt" &
processnumber=$!
tail -F "/tmp/yourscriptlog.txt" | awk  '/Started server on port 8000/ { system("kill '$processnumber'") }'

Básicamente, este script redirige stdouttu código java a un archivo con el comando &> "/tmp/yourscriptlog.txt", el último &en la primera línea hace que tu código se ejecute como un proceso aislado y en la siguiente línea tenemos el número de este proceso con $!. Teniendo el número del proceso y un archivo de registro, tailfinalmente podemos finalizar el proceso cuando se imprima la línea deseada.

Respuesta2

java -jar xyz.jar | grep -m1 "Started server on port 8000"

Respuesta3

Ajusté la respuesta de @Rafael para ocasiones más complicadas como la mía, donde el guión no se deja simplemente relegar a un segundo plano.

Abra una primera tmuxsesión y coloque su comando (úselo teeen lugar de redirección para ver la salida en vivo), luego separe con Ctrl-B D:

java -jar xyz.jar &> '/var/log/myscript.log'

En otra sesión tmux, maneje la terminación:

tail -F '/var/log/myscript.log' | awk '/Started server on port 8000/ { system("tmux kill-session -t 0") }'

Utilice una sesión con nombre si ya tiene otras sesiones tmux en ejecución.

información relacionada