360导航团队使用 go
语言开发 web
服务时间也比较早,对于 go
服务的进程管理工具的选择上也做了很多尝试。
go
官方并没有提供任何进程管理工具供大家使用,所以我们往往部署线上的 go
服务时会借助其他工具。常用的方式无非是如下这几种:
nohup + &
- 系统内置常驻进程管理工具(
init
,systemd
) - 第三方开源工具(
supervisor
,pm2
,monit
等) - 自研(pmon2)
1. nohup + &
nohup
结合 &
符号双剑合璧,估计是我们经常使用的启动常驻进程(daemon
)的选择方式。它的优势在于,使用超级简单。
# 启动 app 进程
nohup bin/app >/tmp/app.daemon.log 2>&1 &
但低成本的使用,往往也给我们增加了后期维护的成本;比如,如果通过它启动的进程异常退出时,如何重启?
因此,如果使用这种方式启动进程,我们或许还会增加一个 crontab
定时任务,来定期检测进程是否正常运行,如果进程异常,则尝试重启。
但 linux
内置 crontab
最小粒度是分钟级别,也就是说如果你使用这种方式,就需要忍受服务至少会有分钟级别的不可用状态。或者,自己实现一个 crontab
服务。(感觉这条巷子,越走越深)
因此,在线上环境时不推荐这种方式,但在开发环境或者临时调试程序时,可以使用这种便捷方式。
2. 系统级进程管理工具
对于 linux
操作系统都提供了系统级别的进程管理工具,例如: CentOS6
的 init.d
脚本或 initctl
; CentOS7
开始的 systemd
进程管理工具。
利用系统进程管理工具确实很便利,而且这些系统管理工具启动的进程是真正意义的常驻进程,即进程的父进程不再是这些进程管理工具而是由 init
进程接管。因此,就算是进程管理工具本身异常退出,也不会影响所启动的业务进程本身。
使用这种方式的唯一不足的是,需要开发不同操作系统对应的进程部署脚本,有一定的开发工作量。 且不同系统的进程管理操作方式也不一样,有一定的学习成本。
3. 第三方进程管理工具
第三方比较出众的进程管理工具也比较多,比如 supervisor
、 pm2
、 monit
等,这些进程管理工具都可以直接胜任 go
服务二进制文件管理工作,应该有很多团队也在使用。但使用第三方工具也并非十全十美,会面临如下一些问题:
- 第三方软件环境部署,对线上环境有侵入性(尚能接受)。
- 进程管理使用
fork()
方式,存在服务不可用风险。 - 进程管理使用体验问题。
安装第三方软件,确实对线上环境有一定侵入性,如果你想用 supervisor
那系统就得安装 python
,如果想选择 pm2
那就得装个 node
环境。不过好在 linux
都有包管理工具帮我们来决绝这些环境的快速安装问题,所以这一点,目前来说尚能接受。
其次,就是这些进程管理工具启动的进程使用的是 fork()
子进程方式,拿 supervisor
举例来说,当我们运行一个进程后,使用 pstree
打印结果如下:
systemd(1)───supervisord(22443)───test(22472)───{test}(22473,22472)
我们会发觉我们管理的 test
进程其父进程为 supervisord
,而非直接指向 linux
的 init
1号进程。
如果有用过 systemd
进程管理工具经验的朋友,你会发觉,当一个进程启动后,这个进程的父进程会交给 init
进程托管。不妨看看 systemd
托管的 nginx
进程:
ps -ef | grep nginx
root 21626 1 0 Jul07 ? 00:00:18 nginx: master process /usr/local/nginx/sbin/nginx
nobody 29148 21626 0 Aug12 ? 00:00:10 nginx: worker process
nobody 29149 21626 0 Aug12 ? 00:00:35 nginx: worker process
你会发觉, nginx
的父进程 id
竟然是为 1,而不是 systemd
的进程ID. 这样做的好处在于,就算是 systemd
进程管理工具异常挂掉,也不会致使业务进程受到牵连。
此外,就用户使用体验来说,这些进程管理工具中 pm2
体验是最好的,它提供高大上的进程管理界面,当你用过 pm2
工具后,再看其他进程管理工具,你会有一种:"曾经沧海难为水" 的感觉。
4. Pmon2 诞生
分析了如上集中进程管理方式优缺点,我们打算自己实现一个进程管理工具,有如下几个目标:
- 部署简单,减少的线上环境侵入性。
- 进程由
init
直接托管,脱离进程管理工具,规避进程连带影响。 - 优雅的用户体验。
基于上述三点目标,于是 Pmon2
这款进程管理工具应运而生,快速使用命令如下:
sudo pmon2 run [./二进制进程文件] [参数1] ...
Pmon2
基于 go
语言实现,线上部署只需要部署编译后的二进制文件即可,不再需要其他依赖。目前也提供 rpm
包可直接使用 yum
安装一键部署:
sudo yum install -y pmon2
类似 systemd
进程管理工具, pmon2
管理的进程本身脱离 pmon2
进程管理工具本身,因此不会产生因 pmon2
进程异常崩溃而造成的连带影响。
并且, pmon2
提供了优雅的进程管理界面,用以提升用户使用体验。对于公司内部使用项目来说, pmon2
未来规划中还希望提供集成公司 odin
平台自动报警实现。
对于 pmon2
具体详细使用说明,请参考:https://github.com/ntt360/pmon2 欢迎大家拍砖!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
2021-01-09 高可用的Mysql双机热备(Mysql_HA)
2021-01-09 mysql+heartbeat双主高可用
2021-01-09 基于Consul的数据库高可用架构
2021-01-09 MySQL高可用架构之MHA
2021-01-09 数据存储---Mysql双机互为热备方案实践
2020-01-09 几个C++内存泄漏和越界检测工具简介
2019-01-09 static link:关于gcc连接静态库的几种方式