2013-12-21 3 views
2

에서 PID 및 반환 상태를 가져 오기 : PID를 다음 node server.js 실행이 normaly, 다음 파일이 프로세스의 PID를 기록 할 경우 내가 기대하는 것은내가 쉘 조각을 nohup을 + sudo는

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

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

.

하지만 작동하지 않습니다. $?은 sudo 프로세스 상태이므로 항상 0입니까? 그리고 $!node 명령 프로세스의 pid가 아닙니다.

위의 쉘 스크립트에서 정확한 반환 코드와 pid를 node server.js으로 가져 오려면 어떻게해야합니까?

+0

을 . 스크립트 내에서 sudo를 실행하는 것은 나쁜 습관입니다. – mekwall

+0

왜 영원히 사용하지 않습니까? js? –

답변

3

내 최종 솔루션 : 당신은 대신 sudo를 사용하여 스크립트를 실행해야합니다

#!/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

[코드 검토] (http://codereview.stackexchange.com/)에 게시 할 수 있습니다. 여기에 댓글을 달아 볼 항목이 너무 많습니다. – l0b0

+0

@ l0b0 좋습니다. 고마워, :). – atupal

+0

RH Linux에서는 pid = $ (ps -e | grep $! | awk '{print $ 1)에 의해 pid = $ (ps - ppid $! | tail -1 | awk' } ')를 사용하여 pid를 얻습니다. 귀하의 라인은 PID – Phiber

3

백그라운드에서 명령을 실행하면 쉘이 wait 처리가 완료되지 않고 (즉, node이 더 이상 실행되지 않음) 리턴 코드를 얻는 현명한 방법이 없습니다.

$ false & 
$ does_not_exist & 

완전히 데몬에 의존하는, check whether a daemon started properly이다 싶은 것 : 따라서도 이러한 리턴 코드 0이 있습니다. 귀하의 경우에 당신은 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