我通过putty SSH连接到linux服务器 . 我尝试将其作为后台进程运行,如下所示:
$ node server.js &
但是,在2.5小时后终端变为非活动状态并且过程终止 . 无论如何,即使终端断开连接,我仍然能保持活动状态吗?
Edit 1
实际上,我尝试了 nohup
,但只要关闭Putty SSH终端或拔掉我的互联网,服务器进程就会立即停止 .
在Putty有什么我需要做的吗?
Edit 2 (on Feb, 2012)
有一个 node.js
模块,forever . 它将运行node.js服务器作为守护程序服务 .
14 回答
Simple solution (如果你不想回到这个过程,只是希望它继续运行):
Powerful solution (允许您重新连接到流程,如果它是交互式的):
然后,您可以按Ctrl a d分离,然后通过运行
screen -r
附加回来还要考虑更新的屏幕替代方案tmux .
nohup node server.js > /dev/null 2>&1 &
nohup
表示:即使stty被切断,也不要终止此过程 .> /dev/null
表示:stdout转到/ dev / null(这是一个不记录任何输出的虚拟设备) .2>&1
表示:stderr也会转到stdout(已经重定向到/dev/null
) . 您可以用文件路径替换&1以保留错误日志,例如:2>/tmp/myLog
&
结尾意味着:将此命令作为后台任务运行 .你真的应该尝试使用
screen
. 它比仅仅做nohup long_running &
要复杂一点,但是一旦你再也不回来了解屏幕 .首先开始您的屏幕会话:
运行你想要的任何东西
按ctrl A然后按d . 完成 . 你的会话继续在后台进行 .
您可以按
screen -ls
列出所有会话,并通过screen -r 20673.pts-0.srv
命令附加到某些会话,其中0673.pts-0.srv是条目列表 .这是一个老问题,但在Google上排名很高 . 我几乎无法相信最高投票的答案,因为在屏幕会话中运行node.js进程,使用
&
或甚至带有nohup
标志 - 所有这些 - 都只是解决方法 .特别是screen / tmux解决方案,它应该被认为是一个 amateur 解决方案 . Screen和Tmux并不意味着保持进程运行,而是用于多路复用终端会话 . 它希望您的进程附加到终端会话 . 这太脆弱了 . To keep things running you need to daemonize the process!
有很多好的工具可以做到这一点 .
PM2 :http://pm2.keymetrics.io/
我看到支持PM2的一个很大的优势是它可以生成系统启动脚本,使进程在重启之间保持不变:
platform
可以ubuntu|centos|redhat|gentoo|systemd|darwin|amazon
.forever.js :https://github.com/foreverjs/forever
Init scripts :
我不是这个主题的专家,这个答案太长了,但基本上它们都是简单的shell脚本,由OS事件触发 . 你可以阅读更多关于这个here
Docker :
只需使用
-d
选项在Docker容器中运行您的服务器,并且,瞧,您有一个守护进程的node.js服务器!这是一个示例Dockerfile(来自node.js official guide):
然后构建您的图像并运行您的容器:
希望这有助于有人登陆此页面 . 始终使用适当的工具进行工作 . 它可以为您节省很多麻烦和数小时!
另一个解决方案否定了这份工作
nohup
将允许程序在终端终止后继续 . 我实际上有nohup
阻止SSH会话正确终止的情况,所以你也应该重定向输入:根据
nohup
的配置方式,您可能还需要将标准输出和标准错误重定向到文件 .我在我的shell rc文件中有这个功能,基于@ Yoichi的回答:
你可以这样使用它:
它将从活动任务列表中删除命令并将命令发送到后台
Nohup和屏幕为后台运行Node.js提供了很好的解决方案 . Node.js进程管理器(PM2)是一个方便的部署工具 . 在您的系统上全局安装npm:
npm install pm2 -g
运行Node.js应用程序作为守护程序:
pm2 start app.js
您可以选择将其链接到Keymetrics.io由Unitech制作的监控SAAS .
你读过nohup命令吗?
使用sysv init在debian上作为系统服务运行命令:
复制骨架脚本并根据您的需要进行调整,可能您需要做的就是设置一些变量 . 如果某些内容不符合您的需要,您的脚本将继承
/lib/init/init-d-script
中的精确默认值 - 在脚本中覆盖它 . 如果出现问题,您可以在源/lib/init/init-d-script
中查看详细信息 . 强制性变量是DAEMON
和NAME
. 脚本将使用start-stop-daemon
来运行您的命令,在START_ARGS
中您可以定义要使用的start-stop-daemon
的其他参数 .这就是我为维基媒体运行一些python的方法维基:
除了设置变量,我必须覆盖
do_stop_cmd
因为python替换了可执行文件,所以服务没有正确停止 .除了以上很酷的解决方案,我还提到了supervisord和monit工具,它们允许启动进程,监视它的存在并在它死亡时启动它 . 使用'monit',您还可以运行一些活动检查,例如检查进程是否响应http请求
对于Ubuntu我用这个:
问候
试试这个简单的解决方案
cmd并退出