使用Amazon EC2实例作为Socket服务器
使用Amazon EC2实例作为Socket服务器
我通过Putty SSH连接到Linux服务器。我尝试将其作为后台进程运行,如下所示:\n
$ node server.js &
\n然而,2.5小时后,终端变得不活跃,进程停止。有没有办法即使终端断开连接也能保持进程活跃?\n编辑1:\n实际上,我尝试了nohup
,但只要关闭Putty SSH终端或断开我的互联网连接,服务器进程就立即停止。\n在Putty中需要做些什么吗?\n编辑2(于2012年2月):\n有一个node.js
模块,叫做forever。它可以将node.js服务器作为守护进程运行。
使用Amazon EC2实例作为Socket服务器的原因是希望能够在后台运行Node.js进程,并持久化地保持运行。而使用screen或tmux会附加进程到终端会话中,导致进程非常脆弱。为了实现后台运行,需要使用专门的工具来将进程守护化。其中,PM2和forever.js是两个常见的工具,可以通过npm全局安装。另外,也可以使用初始化脚本或Docker容器来实现进程守护。
PM2的基本用法如下:
$ npm install pm2 -g $ pm2 start server.js $ pm2 start server.js -i 4 $ pm2 start ecosystem.json
PM2还可以生成系统启动脚本,使进程在重启后仍能持久化运行:
$ pm2 startup [platform]
forever.js的基本用法如下:
$ npm install forever -g $ forever start app.js $ forever start development.json
另外,可以使用初始化脚本或Docker容器来实现进程守护。初始化脚本是简单的shell脚本,可以在操作系统事件触发时执行。Docker容器可以使用`-d`选项来后台运行,并使Node.js服务器成为一个守护进程。
总结起来,为了实现Node.js进程的后台运行和持久化,可以使用PM2、forever.js、初始化脚本或Docker容器等工具。这些工具可以确保进程在服务器重启后仍能正常运行,并且不需要手动附加到终端会话中。
在使用Amazon EC2实例作为Socket服务器时,出现了无法停止服务器进程的问题。每次使用"$ fuser -k 3002/tcp"命令杀死进程后,它都会重新启动。有人知道如何杀死父进程吗?
解决方法之一是使用nohup命令运行服务器进程,但这种方法无法在EC2中工作,可能是因为需要以root权限运行,但在EC2中无法获得root访问权限。另一个解决方法是使用screen命令创建一个会话,并可以通过运行screen -r命令重新连接到该会话。另外,还可以考虑使用tmux作为screen的替代品。
对于如何在系统首次启动时自动运行该进程的问题,答案取决于操作系统。最简单的方法通常是将命令添加到/etc/rc.local文件中。
然而,请注意,将node.js服务器运行在screen或tmux会话中是一个业余的解决方案,除非只是进行快速测试。为了保持进程运行,需要使用proper tools(如forever、pm2或init.d脚本)来将其守护化。
以上是关于解决无法停止服务器进程的问题以及相关解决方法的讨论。
使用Amazon EC2实例作为Socket服务器的原因是希望在Putty会话关闭后服务器仍然能够继续运行。为了解决这个问题,可以使用以下命令启动服务器:
nohup node server.js > /dev/null 2>&1 &
其中,nohup
表示不会因为断开终端而终止进程,> /dev/null
表示将标准输出重定向到/dev/null,2>&1
表示将标准错误重定向到标准输出,&
表示将命令作为后台任务运行。
这个解决方法较之前接受的答案质量更高,因为它提供了更多的解释和理解。SO不仅仅是关于提问者本身,更关注来寻求帮助的其他人。
至于是否需要重定向标准输出和标准错误,或者是否将它们重定向到文件,取决于具体需求。而2>&1
的作用是将标准错误重定向到与标准输出相同的位置,这也解释了为什么标准错误重定向要放在标准输出重定向之后。
一位用户提出了更简洁的命令nohup node server.js &> /dev/null &
,其中&> file
等价于> file 2>&1
。
另一位用户指出,如果用户理解了这个命令的含义,那么这些解释就没有太多必要,这更适合提问unix stackexchange而不是stackoverflow。
根据原问题,当在Putty中启动node server.js
时,服务器可以正常运行,但是一旦关闭Putty会话,服务器就停止了。使用pm2
或forever
可以解决这个问题。