Search code examples
laravellaravel-scheduler

Check status of an scheduler task before adding and running another task


I have a question about the task scheduling in laravel framework. I already have defined the commands currency:update and currency:archive in the list of console commands. Now, I want to run these two commands in the schedule method but with the following condition:

if this is a time to run the currency:archive command, don't run the other command currency:update until the previous command (i.e. currency:archive) ends; otherwise run the currency:update command.

This is my current code in schedule method:

$schedule->command('currency:archive')
         ->dailyAt('00:00')
         ->withoutOverlapping();

$schedule->command('currency:update')
         ->everyMinute()
         ->withoutOverlapping();

How should I modify it?

Thanks.


Solution

  • In the laravel schedule docs the following two features are mentioned:

    1. Truth test contraints docs
    $schedule->command('emails:send')->daily()->skip(function () {
        return true;
    });
    
    1. Task hooks docs
    $schedule->command('emails:send')
             ->daily()
             ->before(function () {
                 // Task is about to start...
             })
             ->after(function () {
                 // Task is complete...
             });
    

    You could consider setting a variable like $achriveCommandIsRunning to true in the before() closure. In the skip() closure you can return $archiveCommandIsRunning; and in the after() closure you can set the variable back to false again.