Подождите, пока процесс переднего плана не выдаст строку, а затем отправьте ее в фоновый режим.

Подождите, пока процесс переднего плана не выдаст строку, а затем отправьте ее в фоновый режим.

С помощью 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

Идея состоит в том, чтобы запустить сервер в фоновом режиме, а затем выполнять grep его вывода до тех пор, пока не появится ожидаемая строка 'Something 3'( 'Server Initialized'в вашем случае).

#!/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 "$@"

Связанный контент