如何将Node.js作为后台进程运行并保持不间断?

503

我通过 Putty SSH 连接到 Linux 服务器,尝试以后台进程运行:

$ node server.js &

然而,2.5小时后终端变得不活跃,进程就会死亡。有没有办法让进程保持运行状态,即使终端断开连接?


编辑1

实际上,我尝试过nohup,但是一旦我关闭Putty SSH终端或拔掉网络,服务器进程就立即停止了。

我需要在Putty中做些什么吗?


编辑2(2012年2月)

有一个node.js模块,叫做forever。它可以将node.js服务器作为守护进程运行。


8
在我的情况下,当我通过输入“exit”退出终端时,nohup 起作用。但当我只是关闭 Putty 窗口时,它会失败。 - Pawel Furmaniak
14个回答

3

要在debian上使用sysv init将命令作为系统服务运行:

复制骨架脚本并根据您的需求进行调整,可能您只需要设置一些变量。如果某些内容不符合您的需求,则您的脚本将从/lib/init/init-d-script继承良好的默认值,如果出现问题,则可以在源代码/lib/init/init-d-script中查看详细信息。强制变量是DAEMONNAME。脚本将使用start-stop-daemon运行您的命令,在START_ARGS中,您可以定义start-stop-daemon的其他参数以使用。

cp /etc/init.d/skeleton /etc/init.d/myservice
chmod +x /etc/init.d/myservice
nano /etc/init.d/myservice

/etc/init.d/myservice start
/etc/init.d/myservice stop

这是我在维基媒体上运行一些Python代码的方法:
...
DESC="mediawiki articles converter"
DAEMON='/home/mss/pp/bin/nslave'
DAEMON_ARGS='--cachedir /home/mss/cache/'
NAME='nslave'
PIDFILE='/var/run/nslave.pid'
START_ARGS='--background --make-pidfile --remove-pidfile --chuid mss --chdir /home/mss/pp/bin'

export PATH="/home/mss/pp/bin:$PATH"

do_stop_cmd() {
    start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 \
        $STOP_ARGS \
        ${PIDFILE:+--pidfile ${PIDFILE}} --name $NAME
    RETVAL="$?"
    [ "$RETVAL" = 2 ] && return 2
    rm -f $PIDFILE
    return $RETVAL
}

除了设置变量外,我还需要覆盖do_stop_cmd,因为Python替代了可执行文件,导致服务无法正常停止。

3
除了上面的酷炫解决方案,我还想提到supervisord和monit工具,它们可以启动进程、监控其运行状态并在进程死亡后重新启动。使用'monit',您还可以运行一些主动检查,例如检查进程是否响应http请求。

3
我使用以下命令来在Ubuntu中运行此程序:
(exec PROG_SH &> /dev/null &)
祝好!

小细节:如果PROG_SH是可执行文件,则不需要使用“exec”。David提出的解决方案的重点是将子进程与当前运行的shell分离。子进程的父进程变为“pid 1”,当shell终止时不会受到影响。 - SoloPilot

0

尝试这个简单的解决方案

cmd & exit


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