当我们在终端会话中启动一个长时间运行的命令(如 Horizon),然后退出该会话时,终端会向该进程发送“挂断”信号(SIGHUP),这通常会导致它退出。
对于基本解决方案,我们可以使用nohup实用程序调用命令:
nohup php artisan horizon >> horizon.log 2>&1 &
此命令在后台启动 Horizon,并将输出发送到当前工作目录中的Horizon.log 。然后,当我们关闭终端时,进程会忽略挂断信号,因此 Horizon 继续无限期地运行。但是,如果 Horizon 稍后崩溃,它不会自行重启。这就是 Laravel 建议使用像 Supervisor 这样的进程管理器运行 Horizon 的原因——我们可以将supervisord配置为在 Horizon 意外退出时自动重启以防止服务中断。
对上面命令的修改为我们提供了一些相同的功能:
nohup sh -c 'while true; do php artisan horizon; done' >> horizon.log 2>&1 &
此命令每次退出时都会重新启动 Horizon,并且可能足以满足极其有限的托管环境。当然,如果没有额外的配置,它不会在启动时启动,但如果不了解更多关于托管环境的信息,我无法提供任何有用的建议。
最后一点,请记住,当我们将新代码部署到服务器时,我们需要重新启动主 Horizon 进程,以便 Horizon 重新加载任何更改。我们可以执行以下命令,如果我们使用上面的第二个命令运行它,Horizon 将重新启动:
php artisan horizon:terminate