我通过 Putty SSH 连接到 Linux 服务器,尝试以后台进程运行:
$ node server.js &
然而,2.5小时后终端变得不活跃,进程就会死亡。有没有办法让进程保持运行状态,即使终端断开连接?
编辑1
实际上,我尝试过nohup
,但是一旦我关闭Putty SSH终端或拔掉网络,服务器进程就立即停止了。
我需要在Putty中做些什么吗?
编辑2(2012年2月)
有一个node.js
模块,叫做forever。它可以将node.js服务器作为守护进程运行。
我通过 Putty SSH 连接到 Linux 服务器,尝试以后台进程运行:
$ node server.js &
然而,2.5小时后终端变得不活跃,进程就会死亡。有没有办法让进程保持运行状态,即使终端断开连接?
编辑1
实际上,我尝试过nohup
,但是一旦我关闭Putty SSH终端或拔掉网络,服务器进程就立即停止了。
我需要在Putty中做些什么吗?
编辑2(2012年2月)
有一个node.js
模块,叫做forever。它可以将node.js服务器作为守护进程运行。
nohup node server.js > /dev/null 2>&1 &
nohup
的意思是:即使 stty 被切断,也不要终止此进程。> /dev/null
的意思是:将标准输出重定向到 /dev/null(这是一个虚拟设备,不记录任何输出)。2>&1
的意思是:将标准错误输出也重定向到已经重定向到 /dev/null
的标准输出。你可以用文件路径代替 &1 来记录错误日志,例如:2>/tmp/myLog
&
的意思是:将此命令作为后台任务运行。/dev/null
?这样记录日志可真够玩儿的了,如果要调试就祝你好运吧... - Victor Schröder简单的解决方案(如果您不想回到进程并且只想让它继续运行):
nohup node server.js &
还有一个jobs
命令可以查看那些后台运行的进程列表。您可以通过运行命令kill %1
或kill %2
来杀死一个后台进程,其中数字是该进程的索引。
强大的解决方案(允许您重新连接到交互式进程):
screen
你可以通过按下Ctrl+a+d来分离,然后通过运行screen -r
重新附加回来。
另外,请考虑替代screen的更新工具tmux。
sudo bash
。 - shuaiyuancn&
甚至使用nohup
标志 -- 它们都只是解决方法。# 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
初始化脚本:
我不会详细介绍如何编写初始化脚本,因为我不是这个领域的专家,而且这对于本回答来说太长了,但基本上它们是由操作系统事件触发的简单shell脚本。你可以在这里阅读更多信息。
Docker:
只需使用-d
选项在Docker容器中运行您的服务器,voilá,您就有了一个守护进程的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
始终使用适当的工具来完成工作。这将节省您很多头痛和加班时间!
tail -f
命令跟踪pm2生成的日志文件来获得相同的“感觉”。 - Victor Schrödernohup
就是解决方案。它已经内置在Linux中,并且它存在的目的就是为此服务。它只有一行,干净简洁,每次都能按预期工作,无论更新如何。人们应该尽量避免使用第三方工具来处理基本用例。例如Docker示例比最高投票答案中的一个简单命令更冗长和资源密集。我喜欢Docker,但不适用于此。 - Jack_Hu你真的应该尝试使用 screen
。它比仅仅执行 nohup long_running &
更复杂,但一旦理解了 screen,您将再也不会回头。
首先启动您的 screen 会话:
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
命令附加到其中某些会话中,其中20673.pts-0.srv是一个条目列表。
另一个解决方案是放弃这份工作
$ nohup node server.js &
[1] 1711
$ disown -h %1
nohup
命令可以让程序在终端关闭后继续运行。我曾经遇到过nohup
阻止SSH会话正确终止的情况,因此您应该同时重定向输入:
$ nohup node server.js </dev/null &
根据nohup
的配置方式,您可能还需要将标准输出和标准错误重定向到文件。
Nohup和screen提供了在后台运行Node.js的好方法。Node.js进程管理器(PM2)是一个非常方便的部署工具。使用npm在系统上全局安装它:
npm install pm2 -g
要将Node.js应用程序作为守护进程运行:
pm2 start app.js
你还可以选择将它与Keymetrics.io链接,这是由Unitech制作的监控SAAS。
$ disown node server.js &
我在我的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"