如何在断开与EC2实例的SSH连接时保持GlassFish服务器的域处于活动状态?

28 浏览
0 Comments

如何在断开与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服务器。

0
0 Comments

如何在断开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完美地解决了我的问题,谢谢!

0
0 Comments

如何在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脚本。

0
0 Comments

问题的出现原因:用户在使用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连接后仍然处于活动状态。

0