解决supervisor不能监控程序子进程问题

news2024/10/6 15:40:59

先说一下遇到的问题,使用的是beanstalk队列,有两个tube, 使用 supervisor 监控 beanstalk 消费队列(主进程A),主进程A产生两个子进程(子进程B,子进程C),每个子进程处理一个tube的数据。

supervisor配置如下:

[program:queue-worker]
command=/usr/local/bin/php /var/www/html/ctc/console.php queue worker
user=www-data
autostart=true
autorestart=true
redirect_stderr=true
startretries=30
startsecs=10

处理消费队列的代码如下:

/**
 * 启动消费队列
 *
 * @command php console.php queue worker
 */
public function wokerAction()
{
    echo "------ worker start ------" . PHP_EOL;

    $beanstalk = $this->getBeanstalk();
    $logger = $this->getLogger('queue');

    $beanstalk->addWorker(
        'main',
        function (BeanstalkJob $job) use ($config, $logger) {
            $taskId = $job->getBody();
            try {
                $manager = new MainQueue();
                $manager->handle($taskId);
            } catch (\Throwable $e) {
                $logger->error("tube:main, task:{$taskId} exception " . kg_json_encode([
                        'file' => $e->getFile(),
                        'line' => $e->getLine(),
                        'message' => $e->getMessage(),
                    ]));
            }
            exit(0);
        }
    );

    $beanstalk->addWorker(
        'notice',
        function (BeanstalkJob $job) use ($config, $logger) {
            $taskId = $job->getBody();
            try {
                $manager = new NoticeQueue();
                $manager->handle($taskId);
            } catch (\Throwable $e) {
                $logger->error("tube:notice, task:{$taskId} exception " . kg_json_encode([
                        'file' => $e->getFile(),
                        'line' => $e->getLine(),
                        'message' => $e->getMessage(),
                    ]));
            }
            exit(0);
        }
    );

    $beanstalk->doWork();
}

经常会出现下面的报错,子进程B或者C就退出了,但是主进程没事。

shmop_open(): unable to attach or create shared memory segment 'No such file or directory'

也查阅了supervisor的文档,里面有个针对组的配置,但是试了不起作用,这里的组配置应该是针对主进程的,主进程没事,子进程死活就不管了。

stopasgroup=true
killasgroup=true

这个事情折腾了好几天,子进程不定时的会死,总是在找为什么会出现共享内存错误的原因,进程的创建使用的是现成的类库,如果总找不到原因程序就不稳定了。

后来转变思路,反正只有两个tube,干脆搞两个独立进程算了,不纠结什么子进程了,这样就把监控的事情交给了supervisor管理了,其实不是supervisor的问题,是我们使用的姿势不对。

supervisor 配置如下:

[program:queue-main-worker]
command=/usr/local/bin/php /var/www/html/ctc/console.php queue main_worker
user=www-data
autostart=true
autorestart=true
redirect_stderr=true
startretries=30
startsecs=10

[program:queue-notice-worker]
command=/usr/local/bin/php /var/www/html/ctc/console.php queue notice_worker
user=www-data
autostart=true
autorestart=true
redirect_stderr=true
startretries=30
startsecs=10

处理消费队列的代码如下:

(1)处理 main tube 队列

/**
     * 启动main消费队列
     *
     * @command php console.php queue main_worker
     */
    public function mainWorkerAction()
    {
        $tube = 'main';

        echo "------{$tube} worker start ------" . PHP_EOL;

        $beanstalk = $this->getBeanstalk();
        $logger = $this->getLogger('queue');

        while (true) {
            $job = $beanstalk->reserveFromTube($tube);
            if ($job instanceof BeanstalkJob) {
                $taskId = $job->getBody();
                try {
                    $manager = new MainQueue();
                    $manager->handle($taskId);
                    $job->delete();
                } catch (\Throwable $e) {
                    $logger->error("tube:{$tube}, task:{$taskId} exception " . kg_json_encode([
                            'file' => $e->getFile(),
                            'line' => $e->getLine(),
                            'message' => $e->getMessage(),
                        ]));
                }
            } else {
                sleep(1);
            }
        }
    }

(2)处理 notice tube 队列

/**
     * 启动notice消费队列
     *
     * @command php console.php queue notice_worker
     */
    public function noticeWorkerAction()
    {
        $tube = 'notice';

        echo "------{$tube} worker start ------" . PHP_EOL;

        $beanstalk = $this->getBeanstalk();
        $logger = $this->getLogger('queue');

        while (true) {
            $job = $beanstalk->reserveFromTube($tube);
            if ($job instanceof BeanstalkJob) {
                $taskId = $job->getBody();
                try {
                    $manager = new NoticeQueue();
                    $manager->handle($taskId);
                    $job->delete();
                } catch (\Throwable $e) {
                    $logger->error("tube:{$tube}, task:{$taskId} exception " . kg_json_encode([
                            'file' => $e->getFile(),
                            'line' => $e->getLine(),
                            'message' => $e->getMessage(),
                        ]));
                }
            } else {
                sleep(1);
            }
        }
    }

至于为什么当初会选择使用fork子进程的方式,说到底还是图方便,因为有现成的东西,拿来就用,但是出了问题,又迟迟搞不定。吃过亏才发现,还是用点简单稳定的方案,哪怕看上去没有那么美。

酷瓜云课堂-开源知识付费解决方案

项目组件

  • 后台框架:phalcon 3.4.5
  • 前端框架:layui 2.8.2
  • 全文检索:xunsearch 1.4.9
  • 即时通讯:workerman 3.5.22
  • 基础依赖:php7.3, mysql5.7, redis5.0

项目文档

  • 运行环境搭建
  • 系统服务配置
  • 客户终端配置

意见反馈

  • 码云平台
  • 官方社区

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/719298.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Arcgis之Python的Arcpy的点线面对象的创建处理和通过pandas读取txt中的经纬度坐标创建几何对象

前言 本节将介绍点线面对象的创建和处理。创建点对象有三个类,分别是Point、Multipoint、PointGeometry,创建线对象的类为Polyline,创建面对象的类为Polygon。 一、点对象的创建——Point 点对象经常与光标配合使用。点要素将返回单个点对…

蚂蚁内容安全平台天鉴入选“北京市人工智能行业赋能典型案例”

近日,“2023全球数字经济大会”人工智能高峰论坛在京召开。会议发布了一批人工智能行业赋能典型案例,为行业提供重要的示范效应,以推动大模型应用加速赋能千行百业。其中,蚂蚁集团旗下数字藏品平台“鲸探”及内容安全平台“天鉴”…

rk3288-系统语言跟随客户luancher-②

rk3288-系统语言跟随客户luancher_旋风旋风的博客-CSDN博客rk3288-系统语言跟随客户luancherhttps://blog.csdn.net/longmin96/article/details/128265807?spm=1001.2014.3001.5501方法一: 通过修改这个给APK预制成系统软件来获取权限 方法二 客户需求是不修改成系统应用,因…

【计算机视觉 | 目标检测】arxiv 计算机视觉关于目标检测的学术速递(7 月 4 日论文合集)

文章目录 一、检测相关(15篇)1.1 Artifacts Mapping: Multi-Modal Semantic Mapping for Object Detection and 3D Localization1.2 Shi-NeSS: Detecting Good and Stable Keypoints with a Neural Stability Score1.3 HODINet: High-Order Discrepant Interaction Network for…

10 从0开始学PyTorch | 多层神经网络、激活函数、学习能力

前面的训练过程我们已经了解的差不多了,但是我们所用到的模型还是一个线性模型,这一小节就让我们正经开始神经网络的搭建,研究怎么把之前的线性模型替换成神经网络来解决我们的问题。 为了更好的理解神经网络,这里我们把假设的关…

【新版系统架构】第八章-系统质量属性与架构评估

软考-系统架构设计师知识点提炼-系统架构设计师教程(第2版) 第一章-绪论第二章-计算机系统基础知识(一)第二章-计算机系统基础知识(二)第三章-信息系统基础知识第四章-信息安全技术基础知识第五章-软件工程…

(六)python实战——使用Redis库完成redis基本数据类型数据的操作案例

前言 本节内容主要介绍一下在python环境下,使用Redis库实现redis基本数据类型String、List、Set、Zset、Hash等数据的操作,通过案例的演示,学习python环境下,redis缓存数据库的基本使用和操作。 正文 ①使用pip命令安装Redis依…

Redis10大性能优化点(上)

1.Redis真的变慢了吗? 对 Redis 进行基准性能测试 例如,我的机器配置比较低,当延迟为 2ms 时,我就认为 Redis 变慢了,但是如果你的硬件配置比较高,那么在你的运行环境下,可能延迟是 0.5ms 时就…

计算机基础--->数据结构(6)【AVL树(平衡二叉树)】

文章目录 AVL(平衡二叉树)树性质AVL树的操作(Java)节点的创建AVL树的插入1.判断平衡2.保持树的平衡3.判断是否AVL树4.删除节点 全部代码 AVL(平衡二叉树)树 平衡二叉树是一种特殊的二叉搜索树,他…

不再担心代码丢失!掌握同步代码到两个git仓库的绝妙方法!

最近,我手里的项目由于某些原因,需要从一个代码仓库把所有的代码复制到另一个代码仓库中,并且以后再同步代码的时候,需要同时把本地的代码同步到两个代码仓库。为了满足这一需求,我将为大家介绍两种方案。方案一可以实…

飞行动力学 - 第4节-part1-螺旋桨式飞机的最大最小速度 之 基础点摘要

飞行动力学 - 第4节-part1-螺旋桨式飞机的最大最小速度 之 基础点摘要 1. 最小功率和最大/最小速度概念2. 最小功率2.1 手工推导2.2 PPT推导 3. 最大速度和最小速度函数关系4. 参考资料 1. 最小功率和最大/最小速度概念 最小功率:类似抛物线底部斜率为零的位置最大…

Qt-事件(下)(事件过滤、自定义事件)

文章目录 事件过滤自定义事件 事件过滤 event()函数是一个protected的函数,这意味着我们要想重写event(),必须继承一个已有的组件类,——重写其event()函数。event()函数的确有一定的控制,不过有时候我的需求更严格一些&#xff…

使用Python+Autogluon对“员工自评”进行机器学习建模分析

建模核心代码 #员工自评AutoML from autogluon.tabular import TabularDataset, TabularPredictor import warnings warnings.filterwarnings(ignore) train_data TabularDataset(train_df2)# 预测标签 label 员工自评# 模型保存文件名 save_path ../data/AUO-train/model/…

一种快速拓扑聚类算法

使用场景,节点编号不重叠,可以缺损,确定每个节点的相互关系和最大的节点编号,对节点进行聚类。如下图所示,分三个簇,计算每个簇包含的元素。 插入代码,暂时没有继续优化的空间 // TopologicalC…

嵌入式软件开发面试题(一)

目录 1.用预处理指令表示一年有多少秒 2.写出float x 与“零值”比较的if语句 3.为什么说if(0x)比if(x0)好? 4.将地0x8000中存放的整形变量,清除bit1。 5.linux下用shell命令在当前目录下创建myfolder目录,并将此目录的权限设为拥有者可读写群组和…

携手共赢!润建股份与科士达达成战略合作

7月4日(今日),润建股份有限公司(以下简称”润建股份“)与深圳科士达科技股份有限公司,在科士达光明工业园正式签署战略合作框架协议,双方将发挥各自领域的技术优势,在新能源与数字科…

Android开发之屏幕尺寸的兼容

屏幕尺寸和密度 本部分提供了具有特定屏幕配置(由屏幕尺寸和密度定义)的设备的相对数量数据。为了简化针对不同屏幕配置设计界面的过程,Android 将实际屏幕尺寸和密度的范围划分为多个区间(如下表所示)。 ldpi mdpitv…

MySQL之数据库引擎详解(内附面试题:InnoDB和MyISAM的联系与区别)

🥳🥳Welcome Huihuis Code World ! !🥳🥳 接下来看看由辉辉所写的关于MySQL数据库引擎的相关操作吧 目录 🥳🥳Welcome Huihuis Code World ! !🥳🥳 一. 数据库引擎是什么&#xff…

【kubernetes系列】Kubernetes之生命周期和重启策略

概述 Pod 遵循一个预定义的生命周期,起始于 Pending 阶段,如果至少 其中有一个主要容器正常启动,则进入 Running,之后取决于 Pod 中是否有容器以 失败状态结束而进入 Succeeded 或者 Failed 阶段。 在 Pod 运行期间,k…

(30)精准降落和悬停(IRLock)

文章目录 30.1 概述 30.2 哪里可以买到 30.3 连接到自动驾驶仪 30.4 安装到框架上 30.5 通过任务规划器进行设置 30.6 飞行和测试 30.1 概述 Copter 支持使用 IR-LOCK 传感器(IR-LOCK sensor)和声纳或激光雷达(sonar or lidar)进行精确着陆。使用该系统,当飞行…