Supervisor使用备忘

本文介绍Supervisor在进程管理中的作用,包括启动、监控及重启进程等功能,并探讨其相对于其他方法的优势。

为什么要用Supervisor?

从这里说起,服务器端要将程序以daemon运行,其目的是摆脱控制终端的信号影响,以免进程退出。Daemon化流程:
int daemonize()
{
    pid_t pid = fork();
    if (pid == 0)
        exit(0);
    if (setsid() == -1)
        exit(-1);
    umask(0);
    chdir("/tmp");
    close(0);
    close(1);
    close(2);
    int stdfd = open("/dev/null", O_RDWR);
    dup2(stdfd, STDIN_FILENO);  
    dup2(stdfd, STDOUT_FILENO);
    dup2(stdfd, STDERR_FILENO);
    return 0;
}
可以看到,其实daemon化并不麻烦,只在main函数中调用下这个函数就可以了。但是对于后台一直运行的程序,需要看这个进程是否还活着,如果由于某种原因异常退出了,应该重新启动才行。

关于监控某进程,我见过的有以下做法:
方法1:
    启动第二个进程,在该进程中通过ps命令,查看进程是否还在。同时为了避免hung,可以发送个heatbeat消息给被监控进程,根据response查看进程还在否。
缺点:
    若是被监控进程非常忙,那么来不及响应,那么可能会导致误报。
方法2:
    采用master-worker模式,在daemon中分为master进程和worker进程,master进程负责管理worker进程,worker进程负责处理消息。这样master进程的处理逻辑足够简单,当worker进程由于异常退出时,master可以及时唤起新的worker用来替换他。比如nginx/uwsgi。
方法3:
    通过crontab定时任务来定时检查进程是否还在,还可进一步采用类似方法1加上heatbeat检查。

对于以上三种方法,我自己用的最多的是方法二,或许这也跟我写的接口大部分是HTTP协议的有关。因为方法1和方法3还需要在额外的进程来监控,个人比较懒,不想写,但是对于方法2,nginx/uwsgi那是自带的功能,如果我们想自己实现类似的master-worker模式的话,这样比较方便呢?所以supervisor华丽的登场了。

Supervisor可以用来启动并监控我们想要启动的一个或多个进程,这些被启动的进程,supervisor会持续地检查他们,当有异常退出时,会根据配置文件决定是否需要启动异常退出的子进程。除此之外,也提供了很多方便的功能供我们使用。

能做什么

    1. 根据配置文件启动一个或者多个进程
    2. 对于同一个服务,可以启动N个进程
    3. 对于同一个服务,可以启动N个进程,并传递不同参数,比如tornado,可以supervisor启动多个子进程,各个子进程listen不同的端口,这个端口号可以通过参数传递进去
[Note]: tordado这种部署模式为了避免惊群问题,nginx和uwsgi对惊群问题,同样有不同的实现方式。
    4. 可以将子进程的日志输出到目标文件中,特别是当子进程有多个进程时,多个进程访问同一日志文件可能会发生文件内容不一致的错误,所以Supervisor作为主进程,只有一个,这样访问一个日志文件的时候不会发生错误。
    5. 当进程退出时,可以重启该进程
    6. 当进程退出时,可以根据配置文件决定不重启进程
    7. 有一些插件,可以扩展supervisor的功能,例如向子进程发信号,监控子进程的memory等。

不能做什么

1. 在不用插件的情况下,向supervisor发信号,子进程不会收到信号。
[Note]: 可以在插件的帮助下实现。
2. 不能管理daemon进程。因为对于daemon进程而言,supervisor管理的子进程是daemon的启动进程,其在第一次fork()后,就退出了,对于supervisor而言,看到的总是退出的启动进程,因此supervisor发现启动不成功该进程;除此之外,由于fork()后的进程跟启动进程脱离了进程组的关系,因此停止supervisor的时候,这些fork()后的进程也停不掉,所以supervisor不能正确启动和停止daemon进程。


如有问题,请邮箱pengfeicui@yeah.net~
Supervisor是一个用于管理监控进程的工具,可以确保进程始终处于运行状态。以下是使用Supervisor的基本教程: 1. 安装Supervisor:首先,你需要在你的系统中安装Supervisor。具体安装步骤因操作系统而异。你可以通过包管理器(如apt、yum或brew)来安装Supervisor。 2. 配置SupervisorSupervisor的配置文件位于/etc/supervisor/supervisord.conf。你可以通过编辑此文件来配置需要监控的进程。 3. 添加进程配置:在配置文件中,你可以为每个要监控的进程添加一个节(section)。以下是一个示例: ``` [program:myprocess] command=/path/to/your/process directory=/path/to/working/directory autostart=true autorestart=true user=user_name ``` 在上面的示例中,你需要将`/path/to/your/process`替换为要监控的进程的实际路径。`directory`是进程运行时的工作目录。`autostart``autorestart`选项用于定义进程自动启动自动重启的行为。`user`选项指定以哪个用户身份运行该进程。 4. 保存并重启Supervisor:保存Supervisor配置文件后,重新启动Supervisor以使更改生效。可以使用以下命令重启Supervisor: ``` sudo service supervisor restart ``` 5. 管理进程:一旦Supervisor启动,它将开始监控配置文件中指定的进程。你可以使用以下命令管理进程(以示例中的myprocess为例): ``` sudo supervisorctl start myprocess # 启动进程 sudo supervisorctl stop myprocess # 停止进程 sudo supervisorctl restart myprocess # 重启进程 ``` 这是一个Supervisor的基本教程,希望能对你有所帮助。如需了解更多信息,可以参考Supervisor的官方文档或其他相关资源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值