【问题标题】:Laravel Horizon stops after I close ssh我关闭 ssh 后 Laravel Horizo​​n 停止
【发布时间】:2018-11-04 20:42:54
【问题描述】:

我刚刚开始使用 Laravel 和 Horizo​​n,如果我的问题有点过分,我很抱歉。

我已经用 Horizo​​n 和一个 Redis 数据库设置了 Laravel。只要我打开 SSH 连接并在其中运行 php artisan horizon 命令,一切正常。一旦我关闭 SSH 会话,它就会停止工作。

我对这些东西不熟悉,所以我想知道会有什么解决方案。我发现有人说你应该这样做 php artisan horizon & 但这似乎工作了几分钟,然后什么也没有。

系统是在网络服务器上设置的,所以也许 cronjob 可以修复它。但我对这些事情的经验非常有限。我希望有人可以提供帮助。

【问题讨论】:

  • 嗨皮特,刚刚检查我的开放答案。这些有没有回答你的问题?我可以提供更多信息吗?

标签: laravel ssh cron laravel-horizon


【解决方案1】:

https://laravel.com/docs/5.7/horizon#deploying-horizon

如果您将 Horizo​​n 部署到实时服务器,您应该配置一个进程监视器来监视 php artisan horizon 命令并在它意外退出时重新启动它。将新代码部署到服务器时,您需要指示 Horizo​​n 主进程终止,以便进程监视器可以重新启动它并接收您的代码更改。

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

【讨论】:

  • 很高兴你复制粘贴 laravel 文档。我读过它们。但这并不意味着我了解如何管理它。就像我之前说的,我不知道该怎么做。这是 laravel 文档所缺乏的东西,对于那些对系统的 sertan 方面一无所知的人来说,这是一种解释。
  • 您的问题没有提及主管的文档或意识。谷歌搜索“supervisor laravel 教程”应该为您提供有关开始使用 Supervisor 的各种教程;这是一个非常简单的系统,基本上只需要创建一个包含上述内容的配置文件(稍作修改以适应您服务器的文件位置)。
【解决方案2】:

如果服务器操作系统是 linux,一个快速的解决方案是使用 screen 命令:

  1. ssh 进入服务器。
  2. 运行screen
  3. 运行命令php artisan horizon
  4. 点击Ctrl + a,然后点击d,从当前会话中分离,然后退出ssh

【讨论】:

  • 到目前为止这似乎可行,只是想知道是否没有解决方案不那么麻烦:)
  • 可以使用supervisor,但是可能需要安装,这里是配置https://laravel.com/docs/5.7/horizon#running-horizon
  • 看起来很难,因为这是一个网络服务器而不是 vps。所以我怀疑我有这个权利:D
  • 如果您可以 ssh 并拥有对服务器的 root 访问权限,那么这就是您所需要的,或者在 www 目录之外创建文件的权限
【解决方案3】:

当我们在终端会话中启动一个长时间运行的命令(如 Horizo​​n),然后退出该会话时,终端会向该进程发送“挂断”信号 (SIGHUP),这通常会导致它退出。

对于基本解决方案,我们可以使用 nohup 实用程序调用命令:

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

此命令在后台启动 Horizo​​n 并将输出发送到当前工作目录中的 horizo​​n.log。然后,当我们关闭终端时,进程会忽略挂断信号,因此 Horizo​​n 继续无限期地运行。但是,如果 Horizo​​n 稍后崩溃,它不会自行重启。这就是为什么 Laravel 建议使用像 Supervisor 这样的进程管理器运行 Horizo​​n 的原因——我们可以在它意外退出时 configure supervisord to restart Horizon automatically 以防止服务中断。

对上面命令的修改为我们提供了一些相同的功能:

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

此命令每次退出时都会重新启动 Horizo​​n,并且可能足以满足极其有限的托管环境。当然,如果没有额外的配置,它不会在启动时启动,但如果不了解更多关于托管环境的信息,我无法提供任何有用的建议。

最后,请记住,当我们将新代码部署到服务器时,我们需要重新启动主 Horizo​​n 进程,以便 Horizo​​n 重新加载任何更改。我们可以执行以下命令,如果我们使用上面的第二个命令运行它,Horizo​​n 将重新启动:

php artisan horizon:terminate

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-30
    • 2020-09-21
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多