특정 출력을 기반으로 프로세스 종료

특정 출력을 기반으로 프로세스 종료

특정 출력을 기반으로 프로세스를 종료하려면 어떻게 해야 합니까? 예를 들어, Java 프로그램을 실행할 때 java -jar xyz.jar표준 출력에 "포트 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 세션이 실행 중이라면 명명된 세션을 사용하세요.

관련 정보