Comments 4
Однако при тестировании этого всего столкнулся с тем, что если по каким-то причинам (не важно по каким — может, по таймауту / по числу обработанных message’s да или просто по kill) Worker Symfony Messenger прекратит свою работу, то новые консоли с Worker’ами Symfony не открываются.
При этом в «Системном мониторе» видно, что соответствующие PHP-процессы Worker’ов Workerman’а вполне себе живы-здоровы и умирать не собираются (если б умерли — то были бы автоматически перезагружены Workerman’ом и консоли бы открылись).
Особенность запуска с прослойкой в виде bash
https://gist.github.com/portante/e81bc6b8e7560a6b3d9dd1acfdd4d427
Нужно прокинуть через bash до php прохождение posix signal
Нужно прокинуть через bash до php прохождение posix signal
Огромнейшее спасибо за Ваш комментарий!
Я прочитал всё, что изложено на странице по Вашей ссылке.
Однако мне не хватает ума понять вот что:
вот внутри себя Workerman запускает процесс gnome-terminal -- php bin/start_worker
посредством PHP-функции proc_open, shell_exec или ещё как-то - неважно.
Никак не пойму, каким боком тут оказывается bash... Исходный же скрипт, которым внутри себя Workerman запускает gnome-terminal - он же не bash, а php...
И, соответственно, читая про все эти перехваты сигналов bash'евской функцией trap, никак не могу понять, каким боком оно применимо к моей ситуации.
Я пробовал запускать и как bash -c "gnome-terminal -- php bin/start_worker"
, и как bash -c "gnome-terminal -- php bin/start_worker & wait"
и ещё как-то.
И из скрипта а-ля bash bin/gnome.sh
#!/bin/bash
gnome-terminal -- php bin/start_worker
exit 0
пробовал запускать...
И оно даже запускается. Но всё также при прекращении работы Symfony Worker'ов запустившие их Workerman'овские Worker'ы не падают (и, соответственно, не перезагружаются Workerman'ом).
Наверное, я в принципе не понимаю смысл фразы "прокинуть через bash до php прохождение posix signal"...
Если можно - приведите, пожалуйста, пример такой волшебной команды (или иного шаманского действия).....
Нужно запускать без прослойки в виде bash или gnome-terminal
https://github.com/balpom/symfony-messenger-and-workerman/blob/main/bin/runner#L21
Нужно просто почитать документацию как рекомендуют работать
https://symfony.com/doc/current/components/process.html#using-features-from-the-os-shell
https://symfony.com/doc/current/components/process.html#process-signals
Нужно запускать без прослойки в виде bash или gnome-terminal
Да это-то понятно... Без "прослойки" оно работает. С "прослойкой" хотелось для наглядности.
В-общем, задачу запуска с "прослойкой" в виде Gnome Terminal я решил довольно элегантным абсолютно варварским способом: :-)
$pid = posix_getpid(); // Current Workerman's Worker PID.
$line = 'bash -c "gnome-terminal --wait -- php bin/start_worker; kill -SIGQUIT ' . $pid . '"';
$process = Process::fromShellCommandline($line);
$process->run();
Что тут делается:
определяем PID текущего Workerman Worker'а
запускаем gnome-terminal, в котором запускаем Symfony Worker
следующей командой ставим kill, которому динамически подсовываем PID текущего Workerman Worker'а
gnome-terminal обязательно запускаем с опцией --wait.
Это важно, т.к. иначе сразу же исполняется следующая команда. А так терминал ждёт, пока завершится его дочерний процесс (Symfony Worker).
Почему нельзя просто запустить терминал, без bash -c ?
Я пробовал, но при этом вываливается ошибка
sh: 1: kill: Illegal option -S
in /var/www/ ... /vendor/symfony/process/Process.php:270
Детально разбираться что к чему я не стал, но, глядя на текст ошибки, интуитивно понятно, что если запускать терминал не из bash ("напрямую"), то так каким-то образом используется оболочка sh, в которой, видимо, другой синтаксис. Ну и, соответственно, надо запускать через bash...
В-общем, пример я обновил: https://github.com/balpom/symfony-messenger-and-workerman
Теперь команды php bin/start
и php bin/stop
работают с Gnome Terminal как задумано. :-)
Да: в процессе тестирования выяснилось, что старая версия bin/stop работает неправильно.
Поменял местами команды остановки Worker'ов - теперь сначала останавливаются Worker'ы Workerman'а, а потом - Worker'ы Symfony.
Как-то так...
Пример использования Workerman и Symfony Messenger