4

基本上我想要完成的是某种脚本或方法让我启动 node.js 套接字服务器脚本,作为服务。

这是为了让我不必在 SSH 中物理运行“node server.js”,也不必在它打开的情况下坐在那里。

任何帮助,将不胜感激。

谢谢斯科特

4

3 回答 3

4

我认为想要使用不同的东西除了forever. 在我的项目中,我也避免使用这种工具,更多地依赖系统功能。因为我也尽量避免以 root 身份运行我的应用程序,所以我不能使用 SystemV 或 Upstart。

强大的来了shell scripting!我创建了一些bash执行简单任务的脚本,例如process watchdog具有启动、停止、重新启动和查询状态的能力。

检查此代码。随意修改它。要使用它——把你的命令放在 COMMAND 参数中。并执行./path_to_script.sh -start. 这将创建看门狗进程,它将启动您的节点进程并观察它是否死亡,如果是,它将重新启动它。这远不是理想的,所以如果有人有什么要修复、添加、删除的,请随时在下面发表评论。

#!/bin/bash

CURRENT_PATH=$(pwd)

LOGFOLDER=$CURRENT_PATH"/logs/"
PIDFOLDER=$CURRENT_PATH"/pid/"

#PID file where the this script process ID is stored
WATCHDOGPIDFILE=$PIDFOLDER"watchdog-admin.pid"
#PID file where the node process ID is stored
NODEPIDFILE=$PIDFOLDER"node-admin.pid"
#Watchdog process error log file
WATCHDOGLOGFILE=$LOGFOLDER"admin-watchdog-error.log"
#Node process error log file
NODELOGFILE=$LOGFOLDER"admin-error.log"
#Command to be executed on daemon start
COMMAND="node ./admin/app.js 1> /dev/null 2>> $NODELOGFILE"

ARG_1=$1

start() {
    if [ -e $NODEPIDFILE ]; then
        PID=$(cat $NODEPIDFILE)
        if [ $(ps -o pid | grep $PID) ]; then
            return;
        else
            touch $NODEPIDFILE
            nohup $COMMAND &
            echo $! > $NODEPIDFILE
        fi
    else
        touch $NODEPIDFILE
        nohup $COMMAND &
        echo $! > $NODEPIDFILE
    fi
}

stop() {
    if [ -e $NODEPIDFILE ]; then
        PID=$(cat $NODEPIDFILE)
        if [ $(ps -o pid | grep $PID) ]; then
            kill -9 $PID
        fi
        rm $NODEPIDFILE
    fi
}

stopdaemon() {
    stop
    rm $WATCHDOGPIDFILE
    exit 0
}

log() {
    echo $1 >> $WATCHDOGLOGFILE
}

keep_alive() {
    if [ -e $NODEPIDFILE ]; then
        PID=$(cat $NODEPIDFILE)
        if [ $(ps -o pid | grep $PID) ]; then
            return;
        else
            log "Jim, he is dead!! Trying ressurection spell..."
            start
        fi
    else
        start
    fi
}

case x${ARG_1} in
    x-start )

        echo "Starting daemon watchdog"
        nohup "$0" -daemon &> /dev/null &

    ;;

    x-daemon )

        if [ -e $WATCHDOGPIDFILE ]; then
            PID=$(cat $WATCHDOGPIDFILE)
            if [ $(ps -o pid | grep $PID) ]; then
                exit 0;
            fi
        fi

        touch $WATCHDOGPIDFILE

        echo $$ > $WATCHDOGPIDFILE

        #trap the interruption or kill signal
        trap stopdaemon INT SIGINT TERM SIGTERM

        start

        while true; do
            keep_alive
            wait
            sleep 1
        done

    ;;

    x-stop )

        echo "Stopping daemon watchdog"
        PID=$(cat $WATCHDOGPIDFILE)
        kill $PID

    ;;

    x-status )
        #check if process is running and PID file exists, and report it back
    ;;
    x )
        echo "Usage {start|stop|status}"
esac

exit 0
于 2012-12-03T09:42:35.907 回答
1

听起来你想要一个像forever. 这里有一篇入门博客文章。

还有更通用的工具,例如monitupstart

我个人forever在我的业余项目中使用它,它工作得很好。

于 2012-08-21T18:12:53.180 回答
1

这很快就会变得复杂。您真正要求的是如何“守护”进程。它不仅仅是在后台运行它。理想情况下,您希望以不束缚可移动文件系统的方式运行它,并且您希望保留其日志输出并且不让它吐到您的旧终端。你不希望它在你的 shell 退出时被意外杀死,等等......

如果您使用的是 Ubuntu 等基于 Debian 的系统,那么/sbin/start-stop-daemon它可以满足您的大部分需求。提到了为其编写一个 Ubuntu Upstart 配置,这也是一个选项。在 Fedora 等其他发行版上,systemd 提供了通常被认为是这种自动守护程序服务的“镀金”版本。它基本上可以守护和管理任何非显式交互的程序。

于 2012-08-21T19:31:25.520 回答