Pull to refresh

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.

Как-то так...

Sign up to leave a comment.

Articles