启动Node.js Socket服务器作为服务的BASH脚本

4
基本上我想要实现的是一种脚本或方法,让我能够将一个 node.js socket 服务器脚本作为服务启动。
这样就不用在 SSH 中手动运行 'node server.js' 并保持其打开状态。
任何帮助都将不胜感激。
谢谢,Scott。

你是指init.d脚本吗?你尝试过supervisord吗?如果你不需要一个真正的服务,你可以使用screen、tmux。 - jfs
将投票下降视为“没有展示任何研究努力”,因为在帖子标题上进行简单的谷歌搜索就会显示多个结果,并且在stackoverflow.com上有类似的问题。 - Steve Campbell
1
我知道这是一个老问题,但请检查我的解决方案 :) 我也在想要做类似于你的问题,所以我做了它。 - Alexey Kamenskiy
3个回答

4
我认为想使用除了 forever 以外的其他工具并没有任何不妥之处。在我的项目中,我也避免使用这种类型的工具,更多地依赖于系统能力。由于我也试图避免将我的应用程序作为 root 运行,因此我无法使用 SystemV 或 Upstart。

这时强大的 shell 脚本 登场了!我创建了一些简单任务的 bash 脚本,例如带有启动、停止、重启和查询状态功能的 进程看门狗

请查看以下代码。随意修改它。要使用它,请将你的命令放在 COMMAND 参数中。然后执行 ./path_to_script.sh -start。这将创建一个看门狗进程,它将启动你的 node 进程,并监视它是否死亡,如果是,则会重新启动它。这远非完美,因此如果有人想在这里修复、添加或删除内容,请随意在下面评论。

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

1

听起来你想要一个像 forever 这样的工具。这里有一篇入门博客文章 在这里

还有一些更通用的工具,比如 monitupstart

我个人在我的副业项目中使用 forever,它一直运行得很好。


我非常喜欢Forever,但在将脚本作为守护进程运行在较新版本的Node上时遇到了一些问题。最终我选择了Upstart,它也运行得很好。 - Michelle Tilley

1
这很快就变得复杂了。你真正想要的是如何“守护”进程。这不仅仅是简单地在后台运行它。理想情况下,您希望以这样的方式运行它,不会占用可移动文件系统,同时保留其日志输出,而不是将其吐出到旧终端上。当您的shell退出时,您不希望它被意外终止等等…
如果您使用像Ubuntu这样的基于Debian的系统,则/sbin/start-stop-daemon可以完成您想要的大部分工作。撰写Ubuntu Upstart配置也是一种选择。对于其他发行版(如Fedora),systemd提供了通常被认为是自动守护服务的“金版”版本。它可以守护并管理基本上任何不明确交互式的程序。

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