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

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

$ node server.js &

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


编辑1

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

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


编辑2(2012年2月)

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

755490 次浏览

你读过nohup命令吗?

简单的解决方案(如果你对返回进程不感兴趣,只是想让它继续运行):

nohup node server.js &

还有jobs命令可以查看这些后台进程的索引列表。你可以通过运行kill %1kill %2来终止后台进程,并将数字作为进程的索引。

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

screen

然后,你可以通过按Ctrl+a+d来分离,然后通过运行screen -r来重新连接

还可以考虑screen的更新替代方案tmux。

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

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

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

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

  1. nohup表示:即使stty被切断,也不要终止此进程 李。< / em > < / >
  2. > /dev/null表示:标准输出到/dev/null(这是一个dummy 不记录任何输出的设备)。李< / em > < / >
  3. 2>&1表示:stderr也会转到stdout(它已经被重定向到__ABC1)。你可以用一个文件路径替换&1来保存错误日志,例如:2>/tmp/myLog
  4. 结尾的&表示:将此命令作为后台任务运行。

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

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

你真的应该尝试使用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是一个条目列表。

我在我的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"
$ disown node server.js &

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

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

npm install pm2 -g

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

pm2 start app.js

你可以选择将它链接到Keymetrics.io,一个由Unitech制作的监控SAAS。

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

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

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

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脚本:

我不会详细介绍如何编写init脚本,因为我不是这方面的专家,回答这个问题太长了,但基本上它们是简单的shell脚本,由OS事件触发。你可以阅读更多关于在这里

码头工人:

只要在Docker容器中使用-d选项和运行你的服务器,你就有了一个daemonized node.js服务器!

下面是一个示例Dockerfile(来自node.js 官方指南):

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

希望这有助于有人登陆这个页面。每次工作都要使用合适的工具。它会帮你省下很多头疼的事情和时间!

使用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

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

除了上面提到的很酷的解决方案,我还提到了监督和监控工具,这些工具允许启动进程,监控进程的存在,并在进程死亡时启动进程。使用“monit”,您还可以运行一些主动检查,如检查进程是否响应http请求

对于Ubuntu,我使用这个:

/dev/null &)

问候

试试这个简单的解决方法

cmd,退出