포그라운드 프로세스가 문자열을 방출할 때까지 기다린 후 백그라운드로 보냅니다.

포그라운드 프로세스가 문자열을 방출할 때까지 기다린 후 백그라운드로 보냅니다.

스크립트를 사용하여 bash프로세스를 시작하고 특정 문자열을 stdout(예: 'Server Initialized')에 쓸 때까지 기다린 다음 이를 백그라운드로 보내고 스크립트를 계속 진행합니다. 한 번 'Server Initialized'인쇄되면 프로세스 출력이 무시되는 것이 더 좋습니다 ( /dev/null?로 리디렉션됨).

지금은 해킹으로 10초 동안 기다리고 서버가 시작되었다고 가정합니다.

( ./long_running_process ) > /dev/null 2>&1 &
# sleep 10
echo 'I run after long_running_process prints "Server Initialized"

시간 초과 후에도 검색 문자열이 나타나지 않으면 오류 상태 코드와 함께 종료되는 경우 보너스 포인트가 있습니다.

답변1

아이디어는 백그라운드에서 서버를 실행한 다음 예상 문자열이 나타나는 동안 'Something 3'( 'Server Initialized'귀하의 경우) 출력을 grep하는 것입니다.

#!/bin/bash

main()  
{
    output=$(mktemp "${TMPDIR:-/tmp/}$(basename $0).XXX")
    server &> $output &
    server_pid=$!
    echo "Server pid: $server_pid"
    echo "Output: $output"
    echo "Wait:"
    until grep -q -i 'Something 3' $output
    do       
      if ! ps $server_pid > /dev/null 
      then
        echo "The server died" >&2
        exit 1
      fi
      echo -n "."
      sleep 1
    done
    echo 
    echo "Server is running!" 
}

server() 
{       
    i=0
    while true; do
      let i++
      echo "Something $i"  
      sleep 1
    done
}

main "$@"

관련 정보