Как процесс Kill node при уничтожении процесса навсегда

У меня есть скрипт для запуска и остановки моего сервера node.js. Когда я останавливаю сценарий, процесс навсегда уничтожается, однако процесс узла не завершается.

Есть ли способ остановить процесс навсегда и узел, когда я выдаю

Kill $FOREVER_PID

Вот скрипт -

    #!/bin/bash
path="/Users/aayush/Desktop/node/rest-api"
action="forever errorLog_express.js "

logFile="$path/system.log"
pidFile="$path/pidFile.pid"

#messages
usage="Usage : node-script.sh start|stop"
panic="Panic! nothing to do, exiting"
unknown="Unrecognized parameter"
start="[starting node-forever]"
end="[stopping node-forever]"
notRunning="Process node-forever not running"
alreadyRunning="Process node-forever already running"

if [ -z $1 ]
then
    echo $panic
    echo $usage
    exit 0;
fi

if [ $1 = "start" ]
then
    # starting process
    dummy="OK"
    if [ -f $pidFile ];
    then
        exit 0
    else
        cd $path
        echo "cd $path"
        echo $start
        echo $start >> $logFile
        $action > /dev/null 2>&1 &
        Process_Pid=$!
        echo $Process_Pid > $pidFile
        echo $dummy
        exit 0
    fi
elif [ $1 = "stop" ]
then
    # stopping process by getting pid from pid file
    dummy="OK"
    echo $end
    echo $end >> $logFile
    if [ -f $pidFile ];
    then
        while IFS=: read -r pid
        do
            # reading line in variable pid
            if [ -z $pid ]
            then
                dummy="FAILED"
                echo "Could not parse pid PANIC ! do 'ps' and check manully"
            else
                echo "Process Pid : $pid"
                kill $pid
            fi
        done <"$pidFile"
        rm $pidFile
        echo $dummy
        exit 0
    else
        echo $notRunning
        echo "FAILED"
        exit 0
    fi
else
    echo $unknown
    echo $usage
    exit 0
fi

Окончательный сценарий работает для меня -

#!/bin/bash
#proccessname: node

USER=node
PWD=node
node=node
forever=forever
path="/Users/aayush/Desktop/node/rest-api"
action="forever start -l forever.log -a -o out.log -e err.log errorLog_express.js "

start(){
cd $path
$action
     }

stop(){
  /usr/local/bin/forever stopall
 }

restart(){
stop
start
}

status(){
/usr/local/bin/forever list
}

#Options 

case "$1" in
    start)
    start
    ;;
    stop)
    stop
    ;;
    restart)
    stop
    start
    ;;
    status)
    status
    ;;
    *)
    echo $ "usage $0 {start | stop | status | restart}"

    exit 1
esac
exit 0

person Aayush    schedule 02.10.2013    source источник
comment
Нашел способ. Думаю, это не оптимальное решение, но пока работает. Я получаю PID узла, используя ps aux | grep node | grep -v grep | awk '{print $2}', а затем убиваю процесс узла.   -  person Aayush    schedule 02.10.2013
comment
Почему бы не использовать встроенную функциональность Forever для управления сценариями?   -  person robertklep    schedule 02.10.2013
comment
узел killall работает, но имеет ту же проблему, что и ps aux | grep node | grep -v grep | awk '{print $2}'. Что делать, если существует более одного экземпляра node. Предположим, что один для входа в монго, а другой для отдыха, например, API   -  person Aayush    schedule 02.10.2013
comment
вместо ps aux | grep node | grep -v grep | awk '{print $2}'вы можете использовать pidof node или pgrep node для получения списка pids. Вы также можете использовать pkill node вместо kill $(pidof node).   -  person krouis    schedule 27.11.2013
comment
github.com/foreverjs/forever/issues/791   -  person rafa.ferreira    schedule 29.12.2015


Ответы (2)


Да, используйте обработчик сигналов в своем скрипте, чтобы поймать сигтерм и убить процесс узла.

www.gnu.org/software/bash/manual/html_node/Signals.html

person DusteD    schedule 23.12.2013

$ killall node

Убьет их.

person timxor    schedule 20.01.2017