如何在仅在前台运行的后台命令中运行?

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;
    
 

【讨论】:

以上是关于如何在仅在前台运行的后台命令中运行?的主要内容,如果未能解决你的问题,请参考以下文章

如何把linux后台任务调到前台

如何高效的在后台运行 Linux 命令?

仅在前台应用:如何避免“未声明后台位置访问”

Docker 容器后台运行和前台运行的区别

linux 如何后台运行

linux后台运行和关闭查看后台任务