如何运行Node.js作为后台进程,永远不会死?

时间:2011-01-25 17:53:34

标签: node.js linux background-process

我通过putty SSH连接到linux服务器。我尝试将其作为后台进程运行:

$ node server.js &

但是,2.5小时后终端变为非活动状态并且过程终止。无论如何,即使终端断开连接,我仍然可以保持进程有效吗?


修改1

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

在Putty有什么我需要做的吗?


编辑2(2012年2月)

有一个node.js模块forever。它将运行node.js服务器作为守护程序服务。

14 个答案:

答案 0 :(得分:1095)

nohup node server.js > /dev/null 2>&1 &

  1. nohup表示:即使stty被切断,也不要终止此过程 关闭。
  2. > /dev/null表示: stdout转到/ dev / null(这是一个虚拟的 不记录任何输出的设备。
  3. 2>&1表示: stderr也会转到stdout(已经重定向到/dev/null)。您可以将& 1替换为文件路径以记录错误,例如:2>/tmp/myLog
  4. 最后
  5. &表示:将此命令作为后台任务运行。

答案 1 :(得分:506)

简单的解决方案(如果您对恢复流程不感兴趣,只是希望它继续运行):

nohup node server.js &

强大的解决方案(允许您重新连接到流程,如果它是交互式的):

screen

然后您可以按Ctrl + a + d分离,然后通过运行screen -r附加回来

还要考虑屏幕的新选择,tmux。

答案 2 :(得分:137)

你真的应该尝试使用screen。这比执行nohup long_running &要复杂一点,但是一旦你再也不回来,就要理解屏幕。

首先开始您的屏幕会话:

user@host:~$ screen

运行您想要的任何内容:

wget http://mirror.yandex.ru/centos/4.6/isos/i386/CentOS-4.6-i386-binDVD.iso

按ctrl + A然后按d。完成。您的会话将继续在后台进行。

您可以按screen -ls列出所有会话,并通过screen -r 20673.pts-0.srv命令附加到某些会话,其中0673.pts-0.srv是条目列表。

答案 3 :(得分:118)

这是一个老问题,但在Google上排名很高。我几乎无法相信最高投票的答案,因为在屏幕会话中运行node.js进程,使用&或甚至使用nohup标志 - 所有这些 - 都只是的解决方法。

特别是screen / tmux解决方案,它应该被视为业余解决方案。 Screen和Tmux并不意味着保持进程运行,而是用于多路复用终端会话。当您在服务器上运行脚本并想要断开连接时,这很好。但是对于node.js服务器,您不希望将进程附加到终端会话。这太脆弱了。 为了让事情顺利进行,你需要对这个过程进行守护!

有很多好的工具可以做到。

PM2 http://pm2.keymetrics.io/

# basic usage
$ npm install pm2 -g
$ pm2 start server.js

# you can even define how many processes you want in cluster mode:
$ pm2 start server.js -i 4

# you can start various processes, with complex startup settings
# using an ecosystem.json file (with env variables, custom args, etc):
$ pm2 start ecosystem.json

我认为有利于PM2的一大优势是,它可以生成系统启动脚本,使重启之间的过程持续存在:

$ pm2 startup [platform]

platform可以是ubuntu|centos|redhat|gentoo|systemd|darwin|amazon

forever.js https://github.com/foreverjs/forever

# basic usage
$ npm install forever -g
$ forever start app.js

# you can run from a json configuration as well, for
# more complex environments or multi-apps
$ forever start development.json

初始化脚本

我没有详细介绍如何编写init脚本,因为我不是这个主题的专家,这个答案太长了,但基本上它们都是简单的shell脚本,由OS触发事件。您可以阅读有关此here

的更多信息

<强>泊坞

只需在带有-d选项的Docker容器中运行您的服务器,并且voilá,您有一个守护进程的node.js服务器!

以下是Dockerfile示例(来自node.js official guide):

FROM node:argon

# Create app directory
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

# Install app dependencies
COPY package.json /usr/src/app/
RUN npm install

# Bundle app source
COPY . /usr/src/app

EXPOSE 8080
CMD [ "npm", "start" ]

然后构建你的图像并运行你的容器:

$ docker build -t <your username>/node-web-app .
$ docker run -p 49160:8080 -d <your username>/node-web-app

希望这可以帮助有人登陆此页面。始终使用适当的工具进行工作。它可以为您节省很多麻烦和数小时的时间!

答案 4 :(得分:24)

另一种解决方案否定了这份工作

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

答案 5 :(得分:14)

nohup将允许程序在终端终止后继续。我实际上遇到nohup阻止SSH会话正确终止的情况,所以你也应该重定向输入:

$ nohup node server.js </dev/null &

根据nohup的配置方式,您可能还需要将标准输出和标准错误重定向到文件。

答案 6 :(得分:7)

我在我的shell rc文件中有这个功能,基于@Yoichi的回答:

nohup-template () {
    [[ "$1" = "" ]] && echo "Example usage:\nnohup-template urxvtd" && return 0
    nohup "$1" > /dev/null 2>&1 &
}

你可以这样使用它:

nohup-template "command you would execute here"

答案 7 :(得分:7)

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

npm install pm2 -g

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

pm2 start app.js

您可以选择将其链接到Keymetrics.io由Unitech制作的监控SAAS。

答案 8 :(得分:6)

$ disown node server.js &

它将从活动任务列表中删除命令并将命令发送到后台

答案 9 :(得分:5)

您是否阅读过nohup命令?

答案 10 :(得分:3)

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

复制骨架脚本并根据您的需要进行调整,可能您需要做的就是设置一些变量。如果某些内容不符合您的需要,您的脚本将继承/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

这就是我为维基媒体wiki运行一些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替换了可执行文件,所以服务没有正常停止。

答案 11 :(得分:3)

除了以上很酷的解决方案之外,我还提到了supervisord和monit工具,这些工具允许启动进程,监控它的存在并在它死亡时启动它。随着&mon;&#39; monit&#39;您还可以运行一些活动检查,例如检查进程是否响应http请求

答案 12 :(得分:3)

对于Ubuntu我使用:

  

(exec PROG_SH&amp;&gt; / dev / null&amp;)

问候

答案 13 :(得分:0)

试试这个简单的解决方案

cmd &amp;出口

相关问题