Laravel Horizon останавливается после закрытия SSH

Я только начинаю с Laravel и Horizon, поэтому извините, если мой вопрос немного там.

У меня есть настройка laravel с горизонтом и база данных Redis. Все работает нормально, пока у меня открыто мое соединение с командой "php artisan horizon". Как только я закрываю ssh, он перестает работать.

Я новичок в этих вещах, поэтому мне интересно, какое решение будет. Я обнаружил, что кто-то говорит, что вы должны сделать "php artisan horizon", но, кажется, это работает в течение нескольких минут, а затем ничего.

Система настроена на веб-сервере, поэтому, возможно, cronjob сможет это исправить. Но мой опыт с этими вещами очень ограничен. Я надеюсь, что кто-то там может помочь.

2 ответа

https://laravel.com/docs/5.7/horizon

Если вы развертываете Horizon на работающем сервере, вы должны настроить монитор процесса для мониторинга php artisan horizon команда и перезапустите его, если он неожиданно завершает работу. При развертывании свежего кода на вашем сервере вам нужно будет дать команду основному процессу Horizon завершить его, чтобы он мог быть перезапущен вашим монитором процесса и получить изменения кода.

Laravel рекомендует Supervisor для этого:

[program:horizon]
process_name=%(program_name)s
command=php /home/forge/app.com/artisan horizon
autostart=true
autorestart=true
user=forge
redirect_stderr=true
stdout_logfile=/home/forge/app.com/horizon.log

Когда мы запускаем длительную команду (например, Horizon) в сеансе терминала, а затем завершаем этот сеанс, терминал отправляет сигнал "зависания" (SIGHUP) этому процессу, который обычно приводит к его выходу.

Для базового решения мы можем вызвать команду с помощью утилиты nohup:

nohup php artisan horizon >> horizon.log 2>&1 &

Эта команда запускает Horizon в фоновом режиме и отправляет выходные данные в horizon.log в текущем рабочем каталоге. Затем, когда мы закрываем терминал, процесс игнорирует сигнал зависания, поэтому Horizon продолжает работать бесконечно. Однако, если Horizon упадет позже, он не перезапустится сам. Вот почему Laravel рекомендует запускать Horizon с менеджером процессов, таким как Supervisor, - мы можем настроить supervisord для автоматического перезапуска Horizon, когда он неожиданно завершает работу, чтобы предотвратить перерыв в обслуживании.

Модификация команды выше дает нам немного той же функциональности:

nohup sh -c 'while true; do php artisan horizon; done' >> horizon.log 2>&1 &

Эта команда перезапускает Horizon при каждом выходе и может быть достаточной для крайне ограниченных сред размещения. Конечно, он не запустится при загрузке без дополнительной настройки, но я не могу дать полезного совета, не зная больше о среде хостинга.

В заключение: помните, что нам нужно перезапустить основной процесс Horizon при развертывании нового кода на сервере, чтобы Horizon перезагружал любые изменения. Мы можем выполнить следующую команду, и Horizon перезапустится, если мы запустим ее, используя вторую команду выше:

php artisan horizon:terminate

Быстрое решение будет использовать screen Команда, если сервер ОС Linux:

  1. SSH в сервер.
  2. бежать screen,
  3. запустить команду php artisan horizon,
  4. удар Ctrl + a, затем d, чтобы отключиться от текущего сеанса, затем выйти из SSH
Другие вопросы по тегам