如何在仅在前台运行的后台命令中运行?
Posted
技术标签:
【中文标题】如何在仅在前台运行的后台命令中运行?【英文标题】:How can I run in background command, which runs only in foreground? 【发布时间】:2021-07-04 23:45:46 【问题描述】:我有命令,其工作方式类似于 php artisan queue:listen
。而且它不能在后台共同工作,但我必须将它添加到 cron 选项卡,但它在那里不起作用。是否可以做类似php artisan schedule:run
的事情?最重要的是,当我中断此命令时,所有功能都将停止。在这种情况下我该怎么办?
【问题讨论】:
【参考方案1】:Laravel 有自己的 cron。首先,你应该将 Laravel cron 添加到 Linux 系统 cron
* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1
然后你可以将你的命令添加到 Laravel cron 中。
Laravel crons 位于 /app/Console/Kernel.php 文件中 are 应该在函数内部 受保护的功能计划(Schedule $schedule) 例如
protected function schedule(Schedule $schedule)
$schedule->command('emails:send Taylor --force')->cron('* * * * *');
但是,如果您希望您的命令作为系统进程而不是 cron 运行,您应该使用 supervisors 程序(supervisord),或者您可以为 PHP 命令文件创建一个 systemd 服务文件,然后像正常的 systemd 服务一样运行,并且甚至还可以通过 web 界面中的监控程序管理此服务
【讨论】:
谢谢,我想我会尝试使用Supervisor,因为它在cron中不起作用。 是的,使用 Supervisord 是个好主意,在 Laravel 文档laravel.com/docs/8.x/queues#supervisor-configuration 中有一些关于它的信息 我尝试通过 Supervisor 进行操作,效果很好。谢谢你。但是,如果我在 DB 中更改某些内容,它不会重新启动。实际上,我将自动重启放入配置中。我能做些什么?因为当我更改设置值时,它也不会更改,而我不使用 supervisorctl restart【参考方案2】:如果您的 php 脚本是一个进程,则意味着类的构造函数方法仅在您启动脚本时运行,并且如果您在构造函数中红色 db 数据,则脚本中的数据将是陈旧的 您的流程脚本应该是这样的处理
class OpenOrders extends Command
public function __construct()
parent::__construct();
public function handle()
$this->initTicker();
$this->updateBalances();
//the Process
while (true)
//this is the right place to read DB data
$this->getAllOptions();
$this->openOrders = $this->getOpenOrders();
return 0;
【讨论】:
以上是关于如何在仅在前台运行的后台命令中运行?的主要内容,如果未能解决你的问题,请参考以下文章