2014-09-10 2 views
0

В настоящее время я использую метод, описанный в How do I write a bash script to restart a process if it dies?, lhunath, чтобы перезапустить мертвый процесс.Сценарий оболочки: как перезапустить процесс (с трубой), если он умирает

until myserver; do 
    echo "Server 'myserver' crashed with exit code $?. Respawning.." >&2 
    sleep 1 
done 

Но вместо того, просто вызывая процесс MyServer, я хотел бы вызвать такую ​​вещь:

myserver 2>&1 | /usr/bin/logger -p local0.info & 

Как использовать первый метод с процессом с трубой?

ответ

4

until петля сама по себе может быть передан в logger:

until myserver 2>&1; do 
    echo "..." 
    sleep 1 
done | /usr/bin/logger -p local0.info & 

, поскольку myserver наследует стандартный вывод и ошибки из цикла (который наследует от оболочки).

1

Вы можете использовать переменную PIPESTATUS, чтобы получить код выхода из конкретной команды в конвейере:

while :; do 
    myserver 2>&1 | /usr/bin/logger -p local0.info 
    if [[ ${PIPESTATUS[0]} != 0 ]] 
    then echo "Server 'myserver' crashed with exit code ${PIPESTATUS[0]}. Respawning.." >&2 
     sleep 1 
    else break 
    fi 
done 
+0

Если мы хотим обрабатывать только отказ MyServer (PIPESTATUS [0]), я думаю, что ответ на chepner в более элегантный. Если мы хотим обработать сбой/usr/bin/logger, то ваш шлейф будет лучше. – mcoolive

Смежные вопросы