Завершить процесс при достижении определенного результата

Завершить процесс при достижении определенного результата

Как мне завершить процесс при определенном выводе этого процесса? Например, запустив программу Java с помощью java -jar xyz.jar, я хочу завершить процесс, как только на stdout появится строка "Started server on port 8000".

решение1

Это можно сделать с помощью следующего скрипта, если он grep -m1у вас не работает:

#!/bin/bash

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

По сути, этот скрипт перенаправляет stdoutваш код Java в файл с помощью команды &> "/tmp/yourscriptlog.txt", последняя &в первой строке заставляет ваш код работать как изолированный процесс, а в следующей строке у нас есть номер этого процесса с $!. Имея номер процесса и файл журнала, tailмы можем, наконец, завершить процесс, когда будет напечатана нужная строка.

решение2

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

решение3

Я скорректировал ответ @Rafael для более сложных случаев, таких как мой, где сценарий не позволяет просто отодвинуть себя на задний план.

Откройте первый tmuxсеанс и введите свою команду (используйте teeвместо перенаправления, чтобы увидеть вывод в реальном времени), затем отсоединитесь с помощью Ctrl-B D:

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

В другом сеансе tmux обработайте завершение:

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

Используйте именованный сеанс, если у вас уже есть другие запущенные сеансы tmux.

Связанный контент