supervisor运行golang守护进程

转载:http://studygolang.com/articles/4480


最近在鼓捣golang守护进程的实现,无意发现了supervisor这个有意思的东西。supervisor是一个unix的系统进程管理软件,可以用它来管理apache、nginx等服务,若服务挂了可以让它们自动重启。当然也可以用来实现golang的守护进程,下面描述下具体实现。

安装supervisor

基于centos 6.4。

supervisor使用python编写的,可以用easy_install安装。centos上默认有python的运行环境,安装起来就非常简单了。

$ sudo yum install python-setuptools
$ sudo easy_install supervisor

如果没有看到什么报错,那么就安装成功了,可以使用echo_supervisord_conf查看配置详情,而后生成配置文件。

$ sudo echo_supervisord_conf > /etc/supervisord.conf

golang http服务

先整一个简单的golang http服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package main
 
import (
     "fmt"
     "log"
     "net/http"
)
 
func main() {
     http.HandleFunc( "/" func (w http.ResponseWriter, r *http.Request) {
         fmt.Fprintf(w,  "Hello world" )
     })
 
     err := http.ListenAndServe( ":9090" , nil)
     if err != nil {
         log.Fatal( "ListenAndServe: " , err)
     }
}

直接运行这个程序会占用住终端,下面看看如何用supervisor来跑这个程序。

supervisor配置golang

编辑/etc/supervisord.conf,在最后增加运行程序设置

[program:golang-http-server]
command=/home/golang/simple_http_server
autostart=true
autorestart=true
startsecs=10
stdout_logfile=/var/log/simple_http_server.log
stdout_logfile_maxbytes=1MB
stdout_logfile_backups=10
stdout_capture_maxbytes=1MB
stderr_logfile=/var/log/simple_http_server.log
stderr_logfile_maxbytes=1MB
stderr_logfile_backups=10
stderr_capture_maxbytes=1MB

几个配置说明:

command:表示运行的命令,填入完整的路径即可。
autostart:表示是否跟随supervisor一起启动。
autorestart:如果该程序挂了,是否重新启动。
stdout_logfile:终端标准输出重定向文件。
stderr_logfile:终端错误输出重定向文件。

其余配置说明可以查看官方文档。

启动supervisor

$ sudo /usr/bin/supervisord -c /etc/supervisord.conf

如果出现什么问题,可以查看日志进行分析,日志文件路径/tmp/supervisord.log

tips:如果修改了配置文件,可以用kill -HUP重新加载配置文件

$ cat /tmp/supervisord.pid | xargs sudo kill -HUP

查看supervisor运行状态

$ supervisorctl
golang-http-server RUNNING pid 23307, uptime 0:02:55
supervisor>

输入help可以查看帮助

supervisor> help
default commands (type help ):
=====================================
add clear fg open quit remove restart start stop update
avail exit maintail pid reload reread shutdown status tail version

supervisor运行原理

supervisor运行后本身是守护进程,通过自身来管理相应的子进程,通过观察相应的进程状态就很明了了。

$ ps -ef | grep supervisord
root 23306 1 0 07:30 ? 00:00:00 /usr/bin/python /usr/bin/supervisord -c /etc/supervisord.conf
root 23331 23222 0 07:41 pts/0 00:00:00 grep supervisord

$ ps -ef | grep simple_http_server
root 23307 23306 0 07:30 ? 00:00:00 /home/golang/simple_http_server
root 23333 23222 0 07:41 pts/0 00:00:00 grep simple_http_server

可以很直观的看出golang simple_http_server进程是supervisord的子进程。

supervisor是否靠谱

supervisor的诞生已经10年了,现在是3+版本,所以放心使用吧。

参考

supervisor官网:http://supervisord.org/

关于守护进程以前在玩python的时候有写过其中实现的原理,详细可以参考:linux下python守护进程编写和原理理解


### 配置StarRocks BE作为守护进程 为了使StarRocks Backend (BE)能够稳定可靠地运行,可以利用`supervisor`工具将其配置成守护进程。这不仅有助于自动重启服务,还能简化日志管理和状态监控。 #### 安装Supervisor 对于大多数Linux发行版而言,安装`supervisor`可以通过包管理器完成: ```bash sudo apt-get install supervisor # 对于Debian/Ubuntu系统 # 或者 sudo yum install epel-release # 对于CentOS/RHEL系统 sudo yum install supervisor ``` #### 创建Supervisor配置文件 创建一个新的配置文件用于定义如何启动和监视StarRocks BE实例。通常情况下,这些配置会被放置在`/etc/supervisor/conf.d/`目录下。下面是一个针对StarRocks BE的示例配置文件`starrocks_be.conf`: ```ini [program:starrocks_be] command=/path/to/starrocks/be/start_be.sh ; 启动命令路径 directory=/opt/starrocks/be ; 工作目录 autostart=true ; 自动启动 autorestart=true ; 失败后自动重启 stderr_logfile=/var/log/supervisor/starrocks_be.err.log ; 错误日志位置 stdout_logfile=/var/log/supervisor/starrocks_be.out.log ; 输出日志位置 environment=JAVA_HOME="/usr/lib/jvm/java-8-openjdk-amd64" ; Java环境变量设置, 如果需要的话 user=root ; 运行用户身份 stopasgroup=true ; 停止整个进程组 killasgroup=true ; 杀死整个进程组 ``` 请注意替换上述配置中的路径以匹配实际部署情况下的具体位置[^1]。 #### 更新Supervisor并启用新程序 保存更改后的配置文件,并执行以下命令让`supervisor`加载新的配置项以及开启对应的后台服务: ```bash sudo supervisorctl reread sudo supervisorctl update sudo systemctl enable supervisord.service # 设置开机自启(如果适用) ``` 此时应该可以看到StarRocks BE已经被成功注册到`supervisor`中并且按照设定的方式运行了。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值