Запуск и остановка процесса в скрипте Bash

Я ищу чистый метод для запуска и остановки процессов Java на основе стандартного вывода. По сути, я хочу пройти через цикл for в Bash, который запускает команду java с входными переменными, отслеживает стандартный вывод для конкретной строки "Results:", а затем убивает тот же процесс, затем переходит к следующему, запускает новый процесс Java и продолжается.

Я пытался работать с Coproc, но не смог приблизиться к работе по назначению.

3 ответа

Решение

Ты можешь использовать coproc вот так:

coproc java …
grep -q -m1 'Results:' <&$COPROC && kill $COPROC_PID 

Это будет иметь grep читать из выходных данных Java и убить его, как только он видит соответствующую строку.


Если вы хотите увидеть вывод команды java вместо того, чтобы делать это молча, используйте tee распечатать вывод и отправить его в grep … && kill … группа.

coproc java …
tee <&$COPROC >(grep -q -m1 'Results:' && kill $COPROC_PID)

Я хотел бы использовать screen, Это работает для большинства моих скриптов:

Начать сеанс с именем myjava command

screen -dmS myjava sh -c "/path/to/script.name parameters > /tmp/outfile"

здесь вы хотите отслеживать /tmp/outfile с помощью bash ... (tail -f или что-то)

и убить сессию myjava с

screen -X -S myjava kill

Предполагая, что ваш Java-код просто завершается самостоятельно, когда он получает SIGPIPEВы можете просто передать вывод grep и имеют grep exit as soon as it sees a match. Assuming you are using a version ofGrepthat supports the-moption (GNU and BSDGrepboth do), you can havegrep` выход после первого матча:

java ... | grep -m 1 'Results:'

Один небольшой улов: из-за буферизации ваш java Программа может продолжать работать в течение очень длительного времени, прежде чем grep на самом деле видит строку "Результаты".


Используя только стандартные grep, ты можешь использовать tee для отображения вывода и выхода после нахождения любого совпадения.

java ... | grep 'Results:' | tee | grep -q '.*'

Это переносит ту же проблему буферизации, но усиливается: не только первый grep придется подождать, пока он на самом деле не получит строку "Результаты", но tee возможно, аналогичным образом нужно подождать, пока он, наконец, не получит ту же строку Далее, если линия слишком мала, первый grep может никогда не производить больше вывода, требуя от вас ждать java выйти естественно, прежде чем tee когда-либо видит какой-либо вклад.

Другие вопросы по тегам