Как мне завершить процесс при определенном выводе этого процесса? Например, запустив программу 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.