在没有root用户和特权用户的情况下计划长时间运行的laravel任务的方法

时间:2019-07-05 19:55:57

标签: linux laravel cron scheduled-tasks gnu-screen

我和我的团队正在使用具有受限Linux容器(没有root用户和特权用户)的共享托管服务,我们需要开发一项涉及长时间运行任务(> 600ms)的新功能。

我们考虑了两种可能的解决方案:

  1. 分解任务,并通过前端向服务器发出一个单独的http请求。

  2. 使用bash screen运行带有无限循环的bash脚本,该循环调用php artisan schedule:run(模仿cronjob)

我对第一个解决方案感到不舒服,我认为将服务器逻辑转移到浏览器是错误的。

第二个解决方案只是一个假设(未经测试),我们不确定bash screen是否会在任何时间随机停止。

实现我们的目标的最不稳定的方法是什么?谢谢

1 个答案:

答案 0 :(得分:1)

假定您已经进行了探讨,因为您提到CRON并不是一个选择,但是即使是没有特权的用户也可以设置CRON,这是与Laravel调度程序结合使用的最简单的解决方案。


如果确实没有使用调度程序的实际CRON,那么我确实认为通过浏览器调用HTTP端点是您的最佳选择。只是不要认为您可以 从浏览器调用的端点只能 从浏览器调用;)

https://www.easycron.com/为例(无隶属关系,但第一个Google结果)。您可以在此处设置CRON作业,以调用URL以CRON间隔触发这些任务。在我公司内部称为“可怜的CRON”:)


我同意运行“屏幕”会话是最不可靠的,因为在服务器重新启动时,这些会话不会再次启动,如果“无限循环”崩溃,它将不会自动重新启动。

如果您沿该路线(或任何CRON路线)行驶,则可以使用https://healthchecks.io/(同样没有关联,Google)添加一些监控。这样,您可以定义CRON时间表,并为您提供一个在CRON完成后要调用的URL,如果您的CRON没有根据CRON时间表调用该URL,则会收到通知。可以当保险了。