我通过putty SSH连接到linux服务器。我试着把它作为后台进程运行,就像这样:
$ node server.js &
然而,2.5小时后,终端变得不活动,进程死亡。有没有办法,我可以保持进程活着,即使终端断开?
编辑1
实际上,我尝试了nohup,但只要我关闭Putty SSH终端或拔掉互联网,服务器进程就会立即停止。
我需要在腻子里做什么吗?
编辑2(2012年2月)
有一个node.js模块,永远存在。它将运行node.js服务器作为守护服务。
我通过putty SSH连接到linux服务器。我试着把它作为后台进程运行,就像这样:
$ node server.js &
然而,2.5小时后,终端变得不活动,进程死亡。有没有办法,我可以保持进程活着,即使终端断开?
编辑1
实际上,我尝试了nohup,但只要我关闭Putty SSH终端或拔掉互联网,服务器进程就会立即停止。
我需要在腻子里做什么吗?
编辑2(2012年2月)
有一个node.js模块,永远存在。它将运行node.js服务器作为守护服务。
当前回答
这是一个老问题,但在谷歌上排名很高。我几乎不能相信投票最多的答案,因为在屏幕会话中运行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]
其中平台可以是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选项运行你的服务器,voilá,你就有了一个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
每次工作都要使用合适的工具。它会帮你省下很多头疼的事情和时间!
其他回答
除了上面提到的很酷的解决方案,我还提到了监督和监控工具,这些工具允许启动进程,监控进程的存在,并在进程死亡时启动进程。使用“monit”,您还可以运行一些主动检查,如检查进程是否响应http请求
您了解过nohup命令吗?
试试这个简单的解决方法
CMD & exit
你真的应该尝试使用屏幕。这比仅仅做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是一个条目列表。
简单的解决方案(如果你对返回进程不感兴趣,只想让它继续运行):
nohup node server.js &
还有jobs命令可以查看这些后台进程的索引列表。您可以通过运行kill %1或kill %2来终止后台进程,并将数字作为该进程的索引。
强大的解决方案(允许您重新连接到进程,如果它是交互式的):
screen
然后可以通过按Ctrl+a+d来分离,然后通过运行screen -r来重新连接
还可以考虑screen的更新替代方案tmux。