¿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 -m1
no 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 stdout
tu 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, tail
finalmente 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 tmux
sesión y coloque su comando (úselo tee
en 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.