Запуск и остановка процесса в скрипте 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 of
Grepthat supports the
-moption (GNU and BSD
Grepboth do), you can have
grep` выход после первого матча:
java ... | grep -m 1 'Results:'
Один небольшой улов: из-за буферизации ваш java
Программа может продолжать работать в течение очень длительного времени, прежде чем grep
на самом деле видит строку "Результаты".
Используя только стандартные grep
, ты можешь использовать tee
для отображения вывода и выхода после нахождения любого совпадения.
java ... | grep 'Results:' | tee | grep -q '.*'
Это переносит ту же проблему буферизации, но усиливается: не только первый grep
придется подождать, пока он на самом деле не получит строку "Результаты", но tee
возможно, аналогичным образом нужно подождать, пока он, наконец, не получит ту же строку Далее, если линия слишком мала, первый grep
может никогда не производить больше вывода, требуя от вас ждать java
выйти естественно, прежде чем tee
когда-либо видит какой-либо вклад.