如何在终止forever进程时杀死node进程

8
我有一个脚本来启动和停止我的Node.js服务器。当我停止脚本时,Forever进程被终止,但是Node进程没有被终止。
是否有办法在执行“停止”命令时同时停止Forever和Node进程?
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

找到了一种方法。我猜不是最优解,但它可以暂时解决问题。我正在使用 ps aux | grep node | grep -v grep | awk '{print $2}' 获取节点 PID,然后杀死该节点进程。 - Aayush
8
为什么不使用Forever的内置功能来管理脚本? - robertklep
1
killall node 可以解决问题,但与 ps aux | grep node | grep -v grep | awk '{print $2}' 存在相同的问题。如果有多个 node 实例怎么办?例如,一个用于将日志记录到 mongo,另一个用于 rest-api。 - Aayush
1
你可以使用 pidof node 或者 pgrep node 来获取进程 ID 列表,而不是使用 ps aux | grep node | grep -v grep | awk '{print $2}'。你也可以考虑使用 pkill node 代替 kill $(pidof node) - krouis
https://github.com/foreverjs/forever/issues/791 - rafa.ferreira
2个回答

2

是的,可以使用脚本中的信号处理程序来捕获sigterm并杀死节点进程。

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


-1
$ killall node

会杀死他们。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接