gpt4 book ai didi

php - 主管 : How do I execute custom php command if any of worker e. g。进程 ID 123 停止

转载 作者:行者123 更新时间:2023-12-04 09:15:00 25 4
gpt4 key购买 nike

[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php artisan queue:work --tries=3 --queue=checkin_checkout
directory=/var/www/byjus-ams
autostart=true
autorestart=true
numprocs=5
redirect_stderr=true
stdout_logfile=/var/log/supervisor/supervisord.log
#stopwaitsecs=3600
截至目前,我的主管配置如上所示,并行运行 5 个 worker 。
现在我想要的是:当任何 worker 被杀时,我想触发自定义 php 命令(例如: php artisan broadcast-process-killed )。
任何人都知道如何处理此类事件并在任何工作进程获取后触发自定义 php 命令以及如何配置它?
甚至在下面简化
supervisor> status
laravel-worker:laravel-worker_00 RUNNING pid 9460, uptime 4:32:43
laravel-worker:laravel-worker_01 RUNNING pid 15907, uptime 7:01:51
laravel-worker:laravel-worker_02 RUNNING pid 22621, uptime 6:30:17
laravel-worker:laravel-worker_03 RUNNING pid 15909, uptime 7:01:51
laravel-worker:laravel-worker_04 RUNNING pid 24049, uptime 6:23:00
supervisor>
如果我使用 kill -9 9460 ,我想运行自定义命令。有人用过自定义事件吗?

最佳答案

我找到了一个解决方案,您可以在实际命令之前运行命令:

command=/bin/sh -c "php artisan broadcast-process-started; exec php artisan queue:work --tries=3 --queue=checkin_checkout"
这样做将执行 broadcast-process-started总是在您的 worker 停止工作并重新启动之后。
通过使用 /bin/sh -c你从这两个命令中创建一个命令。通过添加 execute对于第二个“实际”命令,supervisord 将能够处理其 pid。
如果您省略 exec,您将获得由 /bin/sh fork 的 pid。并且您内部的所有命令都将作为子进程产生,而 supervisord 无法处理。因此,当您重新加载子进程时,它仍然存在!所以保留执行器!
如果您翻转命令,广播将不会执行。

事件监听器解决方案

监督配置
[eventlistener:test-listener]
command=php /some/dir/event-listener.php <name>
events=PROCESS_STATE
stderr_logfile=/some/dir/event_err.log
哪里 <name>[program:<name>]您的配置 - 您要观察的程序。

事件监听器.php
编写为 php-script - 您也可以将其编码为 artisan 命令。
<?php

declare(strict_types=1);

$programToListen = $argv[1] ?? false;
$eventsToListen = [
'PROCESS_STATE_EXITED',
'PROCESS_STATE_FATAL',
'PROCESS_STATE_STOPPED',
];

if ($programToListen === false) {
exit(1);
}

while (true) {
// tell supervisord we are ready to receive event-headers
echo 'READY' . PHP_EOL;

$eventHeader = parseEventHeader(fgets(STDIN));

if (
($eventHeader['groupname'] ?? '') === $programToListen &&
in_array(($eventHeader['eventname'] ?? ''), $eventsToListen)
) {
debug(sprintf(
'Handling %s of %s',
$eventHeader['eventname'],
$eventHeader['groupname']
));

// add your code here
// exec('php artisan ...') for example
}

// Tell supervisord we are done handling the event-header
echo 'RESULT 2' . PHP_EOL . 'OK';
}

function debug(string $message): void {
fwrite(STDERR, $message . PHP_EOL);
return;
}

function parseEventHeader(string $eventHeaderString): array {
$keyValuePairs = explode(' ', $eventHeaderString);

$eventArray = [];
foreach ($keyValuePairs as $keyValuePair) {
$keyValue = explode(':', $keyValuePair);

$eventArray[$keyValue[0]] = $keyValue[1];
}

return $eventArray;
}

exit(0)
?>

琐事
  • 而不是使用 echo您可以 fwrite(STDOUT,..)以及,但这对我来说有点太花哨了。
  • 我留在我的调试机制中,以防你想摆弄它(你会:D)。

  • 附加信息
  • 在这里查看可用 Process-Types处理。
  • 在这里查看 Subprocess-States (产生事件)。
  • 事件监听器通知 protocol (我们的 echo 消息和事件头解析)。
  • PROCESS_STATE_EXITED 将在 > kill 上触发或执行结束
  • PROCESS_STATE_STOPPED 将由主管触发(restart 等)
  • 我没有设法触发 PROCESS_STATE_FATAL - 但会听它,以防万一:)
  • 关于php - 主管 : How do I execute custom php command if any of worker e. g。进程 ID 123 停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63270368/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com