我通过putty SSH连接到linux服务器。我试着把它作为后台进程运行,就像这样:

$ node server.js &

然而,2.5小时后,终端变得不活动,进程死亡。有没有办法,我可以保持进程活着,即使终端断开?


编辑1

实际上,我尝试了nohup,但只要我关闭Putty SSH终端或拔掉互联网,服务器进程就会立即停止。

我需要在腻子里做什么吗?


编辑2(2012年2月)

有一个node.js模块,永远存在。它将运行node.js服务器作为守护服务。


当前回答

使用sysv init在debian上以系统服务的形式运行命令:

复制骨架脚本,并适应你的需要,可能你所要做的就是设置一些变量。您的脚本将从/lib/init/init-d-script继承良好的默认值,如果某些内容不符合您的需要-在脚本中重写它。如果出现问题,可以在source /lib/init/init-d-script中查看详细信息。必须的变量是DAEMON和NAME。脚本将使用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替代可执行文件,所以服务没有正确停止。

其他回答

另一个解决方案是放弃这份工作

$ nohup node server.js &
[1] 1711
$ disown -h %1

nohup节点服务器.js > /dev/null 2>&1 &

nohup的意思是:即使stty被切断,也不要终止这个进程 掉了。 > /dev/null意味着:stdout到/dev/null(这是一个dummy 不记录任何输出的设备)。 2>&1表示:stderr也转到stdout(已经重定向到/dev/null)。您可以将&1替换为文件路径以保存错误日志,例如:2>/tmp/myLog 结尾的&表示:将此命令作为后台任务运行。

试试这个简单的解决方法

CMD & exit

Nohup和screen为在后台运行Node.js提供了很好的轻量级解决方案。Node.js进程管理器(PM2)是一个方便的部署工具。在你的系统上使用npm全局安装它:

NPM安装pm2 -g

将Node.js应用程序作为守护进程运行:

Pm2启动app.js

您可以选择将其链接到Keymetrics。io由Unitech开发的监控SAAS。

使用sysv init在debian上以系统服务的形式运行命令:

复制骨架脚本,并适应你的需要,可能你所要做的就是设置一些变量。您的脚本将从/lib/init/init-d-script继承良好的默认值,如果某些内容不符合您的需要-在脚本中重写它。如果出现问题,可以在source /lib/init/init-d-script中查看详细信息。必须的变量是DAEMON和NAME。脚本将使用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替代可执行文件,所以服务没有正确停止。