2013-12-21 4 views
2

У меня есть оболочка сниппет:Получить Pid и возврата статуса из поЬир + Судо

nohup sudo node server.js >> node.log 2>&1 & 

if [ $? -eq 0 ]; then 
    echo $! $? 
    echo $! > pids 
fi 

Что я ожидаю, если node server.js запустить нормально, то запишите PID этого процесса к файлу: PIDS.

Но это не работает, $? всегда 0, потому что это статус процесса sudo? И $! также не является pid процесса node.

Итак, как я могу получить правильный код возврата и pid node server.js в приведенном выше сценарии оболочки?

+0

Вы должны запустить скрипт с Судо вместо , Выполнение sudo внутри скриптов является плохой практикой. – mekwall

+0

Почему вы не используете forever.js? –

ответ

3

Мои окончательные решения:

#!/usr/bin/env bash 

ROOT=$(cd `dirname $0`; pwd) 

sudo kill -9 `cat ${ROOT}/pids` || true 

nohup sudo node server.js >> node.log 2>&1 & 

sleep 1 

pid=$(ps --ppid $! | tail -1 | awk '{ print $1 }') 

if echo $pid | egrep -q '^[0-9]+$'; then 
    echo $pid > ${ROOT}/pids 
else 
    echo 'server not started!' 
fi 
+0

Возможно, вы захотите опубликовать это на [Code Review] (http://codereview.stackexchange.com/). Слишком много вещей, чтобы прокомментировать это сделать здесь. – l0b0

+0

@ l0b0 Хорошая идея. спасибо, :). – atupal

+0

В RH Linux я меняю вашу строку pid = $ (ps --ppid $! | Tail -1 | awk '{print $ 1}') на pid = $ (ps -e | grep $! | Awk '{print $ 1 } '), чтобы получить pid. Ваша строка возвращает мне первое слово в заголовке, которое является PID – Phiber

3

Когда вы выполняете команду в фоновом режиме, для оболочки не существует разумного способа получить код возврата без wait для завершения процесса (т. Е. node больше не работает). Поэтому даже у них есть код возврата 0:

$ false & 
$ does_not_exist & 

кажется, что вы хотите сделать, это check whether a daemon started properly, который полностью зависит от демона. В вашем случае вы начали сервер Node.js, так что вы можете просто запустить что-то вроде этого (непроверенные):

test_if_server_is_running() { 
    tries=10 
    while [ "$tries" -gt 0 ] 
    do 
     let tries-- 
     wget http://127.0.0.1/some_server_path && return 
     sleep 1 
    done 
    return 1 # Did not start up in at least 10 seconds 
} 
+0

с помощью 'wget' для проверки также является полезным способом. :). Благодарю. – atupal

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

  • Нет связанных вопросов^_^