国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

如何通過監(jiān)控重啟服務(wù)呢?

qq7467466

問題描述

我在db里面插入一條記錄,每條記錄代表代表一個進(jìn)程, 如果有新的進(jìn)程進(jìn)來或者狀態(tài)更新, 那么需要新增進(jìn)程/禁用相應(yīng)的進(jìn)程,這樣的功能應(yīng)該如何實現(xiàn)呢?

想到的解決方案

簡單粗暴的方法就行通過php start.php restart -d 去執(zhí)行重啟命令, 但是因為db里面的數(shù)據(jù)是隨時可能發(fā)生變化的, 不能每次都去手動的執(zhí)行重啟, 因此想到了借鑒內(nèi)存溢出重啟/文件監(jiān)控的方案, posix_kill($ppid, SIGUSR1) 但是測試了下是直接重啟的當(dāng)前進(jìn)程, 我新增的進(jìn)程不會,所以應(yīng)該要如何搞呢, 有指令可以發(fā)送重啟的命令嗎? 測試過了reload不符合我的業(yè)務(wù)邏輯,必須用restart

這是我插件自定的process, kafkaConfig是DB讀出來的數(shù)據(jù)

$process = [];
foreach ($kafkaConfig as $value) {
    if($value){
        $process[$value['app_uid']] = [
            'handler'     => \app\queue\kafka\Events::class,
            'count'       => $value['count'], // 進(jìn)程數(shù)
            //'user'    => $group_id,
            //'group'   => $group_id,
            'constructor' => [
                'groupId'    => $value['app_uid'],
                'partition'  => $value['partition'],
                'messageKey' => $value['messageKey'] ?? '',
            ]
        ];
    }
}
return $process;

新起一個監(jiān)控進(jìn)程monitor_kafka_config

檢測DB數(shù)據(jù)...發(fā)生改變,執(zhí)行一下命令

測試的命令
$ppid = posix_getppid();
$pid = posix_getpid();
posix_kill($ppid, SIGINT);
posix_kill($pid, SIGUSR1);
1610 4 0
4個回答

軟飯工程師

這是我的一些大致想法
1,是否真的需要重啟進(jìn)程?能否以數(shù)據(jù)或者回調(diào)函數(shù)來驅(qū)動進(jìn)程內(nèi)邏輯的執(zhí)行
2,是否可以使用自定義進(jìn)程之類的方法,提前啟動需要的進(jìn)程,然后進(jìn)行進(jìn)程分配,老大說的重啟單個進(jìn)程 http://www.wtbis.cn/q/510
3,是否可以使用fork子進(jìn)程的方法來創(chuàng)建進(jìn)程并銷毀進(jìn)程,只創(chuàng)建和銷毀進(jìn)程,不重啟

  • qq7467466 2023-08-23

    這個我試過, 因為我process里面最終不是return 出來一個數(shù)組嗎? 動態(tài)的, kill掉并重啟的話只會重啟第一次渲染出來process, 比如說我首次動態(tài)啟動了5個進(jìn)程, 然后這時候db增加了1個進(jìn)程, 按理說kill掉主進(jìn)程之后這時候應(yīng)該會出來6個進(jìn)程, 但是測試的時候并不會把新的進(jìn)程自動啟動進(jìn)來

  • 軟飯工程師 2023-08-23

    既然這樣,你想辦法把進(jìn)程數(shù)寫到服務(wù)器環(huán)境變量里或者寫到文件里,然后kill 掉所有的webman 進(jìn)程,包括主進(jìn)程,然后用supervisord拉起webman 主進(jìn)程并讀取進(jìn)程數(shù)量

  • 軟飯工程師 2023-08-23

    也就是說把進(jìn)程數(shù)量做持久化,然后主動殺死所有的webman進(jìn)程,這個時候進(jìn)程數(shù)還在,讀取進(jìn)程數(shù),然后依賴docker 健康檢查或者supervisord 把webman 服務(wù)拉起來

  • qq7467466 2023-08-23

    感謝大佬回復(fù), 我試下在主程序里面直接kill掉主進(jìn)程, 然后用supervisord拉起進(jìn)程

  • 軟飯工程師 2023-08-23

    直接使用php start.php stop 殺死進(jìn)程,然后用supervisord或者docker 健康檢查拉起進(jìn)程

北月妖王

首選 workerman 不支持業(yè)務(wù)調(diào)用 pcntl_fork,進(jìn)程一旦啟動就不能動態(tài)修改進(jìn)程數(shù),想要根據(jù)數(shù)據(jù)庫變化進(jìn)程數(shù)就只能重啟。

另外起一個 Workerman,用 Timer 或者 workerman/redis-queue,監(jiān)控數(shù)據(jù)庫變動,然后再去重啟 webman。

  • qq7467466 2023-08-23

    怎么用一個新的Workman 去重啟 webman 呢?

  • 北月妖王 2023-08-23

    如果你不想那么復(fù)雜,可以采用簡單粗暴的做法:shell_exec("php /path/to/webman/start.php restart -d");

  • qq7467466 2023-08-23

    我試過了, 報錯 Workerman[start.php] stopping ... worker[monitor_kafka_config:5099] exit with status 9 Workerman[start.php] has been stopped PHP Notice: fwrite(): write of 152 bytes failed with errno=32 Broken pipe in /data/wwwroot/cloud-events_test/vendor/workerman/workerman/Worker.php on line 2254

  • 北月妖王 2023-08-23

    你自己的業(yè)務(wù)代碼有問題,重新拉一個空的webman項目跑一下,是OK的。

    截圖

  • qq7467466 2023-08-23

    你的這個重啟命令是在 那個進(jìn)程里面寫的呢? 能貼下代碼嗎

  • 北月妖王 2023-08-23

    代碼很簡單就一個定時器:截圖

  • qq7467466 2023-08-23

    我已經(jīng)找到指令了, \posix_kill(posix_getppid(), SIGINT); 然后配合守護(hù)進(jìn)程啟動, 很棒! 感謝大佬

軟飯工程師

我配置了健康檢查,并將進(jìn)程數(shù)作為環(huán)境變量傳入容器,在容器中手動通過,php start.php stop 停止容器,幾秒鐘后容器被健康檢查拉起
截圖
容器中,也能從環(huán)境變量讀取到進(jìn)程數(shù),
截圖
現(xiàn)在就是怎么處理進(jìn)程數(shù)的問題。
如上面老哥所說,再起個Workerman 進(jìn)程維護(hù)進(jìn)程數(shù)量,然后通過workman 定時器 拉起 webman 服務(wù)也很好

  • 暫無評論
efnic

目前我通過這個方法,實現(xiàn)增減進(jìn)程。
http://www.wtbis.cn/q/11025
用模型事件:

  1. 當(dāng)增加或者停止進(jìn)程時,生成./runtime/restart.crontab;
  2. 使用系統(tǒng)本身的crontab,定期執(zhí)行一個重啟webman的php腳本
  • 暫無評論
年代過于久遠(yuǎn),無法發(fā)表回答
??