如何在断开与EC2实例的SSH连接时保持GlassFish服务器的域处于活动状态?
如何在断开与EC2实例的SSH连接时保持GlassFish服务器的域处于活动状态?
我通过putty SSH连接到Linux服务器。我尝试将其作为后台进程运行,如下所示:\n
$ node server.js &
\n然而,2.5小时后,终端变得不活动,并且进程停止。有没有办法在终端断开连接时保持进程的运行?\n
\n编辑1\n实际上,我试过nohup
,但是当我关闭Putty SSH终端或断开我的互联网时,服务器进程立即停止。\n在Putty中有什么我需要做的吗?\n
\n编辑2(于2012年2月)\n有一个node.js
模块,forever。它将以守护进程服务的形式运行node.js服务器。
如何在断开SSH到EC2实例时保持GlassFish服务器域处于活动状态?
这是一个旧的问题,但在Google上排名很高。我几乎无法相信最高投票的答案,因为在screen会话中运行一个node.js进程,使用&
或nohup
标志,所有这些都只是一些变通方法。
特别是screen/tmux解决方案,这真的应该被视为一个业余解决方案。Screen和Tmux并不是为了保持进程运行,而是为了多路复用终端会话。当您在服务器上运行脚本并希望断开连接时,这是可以接受的。但是对于node.js服务器,您不希望将进程附加到终端会话。这太脆弱了。为了让事情继续运行,您需要将进程守护化!
有很多好的工具可以做到这一点。
PM2:
# 基本用法 $ npm install pm2 -g $ pm2 start server.js # 你甚至可以定义在集群模式下要运行的进程数量: $ pm2 start server.js -i 4 # 你可以启动多个进程,并使用复杂的启动设置 # 使用一个包含环境变量、自定义参数等的ecosystem.json文件: $ pm2 start ecosystem.json
我认为PM2的一个重要优点是它可以生成系统启动脚本,使进程在重启时持久化:
$ pm2 startup [platform]
其中platform可以是ubuntu、centos、redhat、gentoo、systemd、darwin或amazon。
forever.js:
# 基本用法 $ npm install forever -g $ forever start app.js # 你也可以从一个json配置文件中运行,用于更复杂的环境或多个应用程序 $ forever start development.json
初始化脚本:
我不会详细介绍如何编写初始化脚本,因为我不是这个主题的专家,而且这个答案会很长,但基本上它们是由操作系统事件触发的简单shell脚本。你可以在这里阅读更多关于这个的信息。
Docker:
只需在Docker容器中运行您的服务器,并使用-d
选项,您就有了一个守护化的node.js服务器!
这是一个示例Dockerfile(来自node.js官方指南):
FROM node:argon # 创建应用程序目录 RUN mkdir -p /usr/src/app WORKDIR /usr/src/app # 安装应用程序依赖 COPY package.json /usr/src/app/ RUN npm install # 打包应用程序源代码 COPY . /usr/src/app EXPOSE 8080 CMD [ "npm", "start" ]
然后构建您的镜像并运行容器:
$ docker build -t/node-web-app . $ docker run -p 49160:8080 -d /node-web-app
使用正确的工具来完成工作。这将为您节省大量的麻烦和时间!
这就是我要找的。使用pm2解决方案是否有办法以后连接终端?
不,不可能,因为该进程不在交互会话中运行。但是您可以通过tail -f
pm2生成的日志文件来实现相同的“感觉”。
您指出了许多人发现可以胜任工作的screen解决方案是一种变通方法。有很多方法可以实现特定的任务。我相信它恰好实现了具体任务“以后台运行且永不停止”,对于许多人来说非常好。它还有一个额外的好处,允许用户重新进入并进行交互和更改。关键是组件是“后台”和“永不停止”。所有的解决方案都有一定的优点。
Ravi - 我不同意。这些都需要额外的下载/软件/工具(除了初始化解决方案外,没有给出解决方案)。nohup
才是解决方案。它已经集成到Linux中,这就是它的存在意义。它只需要一行代码,干净而且每次都能按预期工作,无论更新如何。人们应该尽量避免使用第三方工具来处理这种基本用例。例如,Docker示例比顶级答案中的一个简单命令要冗长得多,资源密集。我喜欢Docker,但对于这个问题来说不适合。
_Hu,我对开销没有疑问,但nohup
解决方案无法满足“永不停止”的要求。除非您编写一个非常棘手的trap
或一个hacky的无限循环,否则我不知道如何在不使用专门为此目的编写的工具(或您自己编写的初始化脚本)的情况下将进程保持守护化。
我同意,我来这里是寻找linux start process background
,但问题实际上是关于Node进程,因此我对原标题进行了编辑。
接受的答案对我没有起作用,pm2完美地解决了我的问题,谢谢!
如何在SSH与EC2实例断开连接时保持GlassFish服务器域处于活动状态?
问题原因:在EC2实例中,无法使用nohup命令来保持GlassFish服务器域处于活动状态,可能是因为需要以root权限运行,而在EC2中无法获得root访问权限。因此需要寻找其他解决方法。
解决方法:使用screen命令来创建一个新的会话,并在会话中运行GlassFish服务器域。这样可以在断开SSH连接后重新连接到该会话。
1. 首先安装screen命令(如果未安装):
sudo apt-get install screen
2. 运行screen命令创建一个新的会话:
screen
3. 在会话中运行GlassFish服务器域命令,例如:
./glassfish/bin/asadmin start-domain mydomain
4. 按下Ctrl+a+d将会话分离。
5. 当需要重新连接到会话时,运行以下命令:
screen -r
通过这种方法,即使在断开SSH连接后,GlassFish服务器域仍将保持活动状态,可以随时重新连接到会话并与其交互。
注意:这种方法适用于需要与进程交互并且需要在断开SSH连接后保持进程运行的情况。对于需要将进程作为守护进程运行的情况,可以使用其他工具如forever、pm2或init.d脚本。
问题的出现原因:用户在使用Putty启动GlassFish服务器的域时,当关闭Putty会话时,服务器会停止运行。
解决方法:使用nohup命令在后台运行GlassFish服务器的域,并将输出重定向到/dev/null,这样即使关闭了SSH连接,服务器仍然会保持活动状态。
具体的解决方法如下:
1. 在SSH连接到EC2实例后,使用以下命令启动GlassFish服务器的域:
nohup node server.js > /dev/null 2>&1 &
2. 解释上述命令的各个部分:
- nohup命令表示:即使在关闭stty时也不要终止这个进程。
- > /dev/null表示:将stdout重定向到/dev/null(一个不记录任何输出的虚拟设备)。
- 2>&1表示:将stderr也重定向到stdout(而stdout已经重定向到/dev/null)。你可以用文件路径替换&1,以记录错误日志,例如:2>/tmp/myLog。
- &表示:将此命令作为后台任务运行。
3. 根据原问题,当在Putty中启动node server.js时,服务器正常运行,但一旦关闭Putty会话,服务器就会停止。使用nohup命令后,即使关闭了Putty会话,服务器仍然会继续运行。
以上就是解决GlassFish服务器的域在关闭SSH连接后仍保持活动状态的方法。通过使用nohup命令和重定向输出到/dev/null,用户可以确保服务器在断开SSH连接后仍然处于活动状态。