嗨,抱歉,我在创建计划命令时遇到了这个问题。
在我们的crontab -e用户中,我们在Debian上插入了以下内容:
* * * * * cd /var/www/myfolder.com/ && php artisan schedule:run >> crontab.laravel
我们已经正确输入了计划功能,如下所示:
app / console / kernel.php
<?php
namespace App\Console;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
class Kernel extends ConsoleKernel
{
/**
* The Artisan commands provided by your application.
*
* @var array
*/
protected $commands = [
// 'App\Console\Commands\HelpCenter',
Commands\HelpCenter::class
];
/**
* Define the application's command schedule.
*
* @param \Illuminate\Console\Scheduling\Schedule $schedule
* @return void
*/
protected function schedule(Schedule $schedule)
{
$schedule->command('elena:help')->everyMinute();
}
/**
* Register the commands for the application.
*
* @return void
*/
protected function commands()
{
$this->load(__DIR__ . '/Commands');
require base_path('routes/console.php');
}
}
但是结果仍然是没有计划的命令可以运行 我们尝试了所有不可能的组合,但一无所获。 如果我们取消对Artisan调用的功能的注释,则脚本将被执行
尝试强制执行命令crontab -e
为了更好地了解问题出在哪里,我们直接在命令中添加了crontab,而没有按如下时间表进行操作:
* * * * * cd /var/www/myfolder.com/ && php artisan elena:help >> crontab.laravel
此命令每分钟运行一次,因此我们无法确定问题出在哪里。 如果您有耐心给我们一些建议,我们将很高兴。美好的一天
答案 0 :(得分:2)
我将其复制到此处,因为这解决了我的问题。这是上面的@piscator评论。
“您是否运行过php artisan cache:clear
?在存储/框架文件夹中可能缓存了一个计划文件。”
编辑:
这个问题给我带来很多麻烦。我正在使用Laravel 5.8,但无法与->withoutOverlapping()
配合使用;任务将在没有明显原因的情况下死掉,然后cron作业无法再次启动它,因为->withoutOverlapping()
阻止了它。
最后,我找到了解决方法here:
基本上,您无需检查Laravel的->withoutOverlapping()
,而是可以检查任务是否已在运行。
// start the queue worker, if its not running
$command = "queue:work --queue=high,email,default,low --tries=3 --delay=3";
if (!$this->osProcessIsRunning($command)) {
$schedule->command($command)->everyMinute()
->runInBackground()
->appendOutputTo(storage_path('logs/queue.log'));
}
// function for checking if the task is running
protected function osProcessIsRunning($needle)
{
// get process status. the "-ww"-option is important to get the full output!
exec('ps aux -ww', $process_status);
// search $needle in process status
$result = array_filter($process_status, function($var) use ($needle) {
return strpos($var, $needle);
});
// if the result is not empty, the needle exists in running processes
if (!empty($result)) {
return true;
}
return false;
}
感谢@henryonsoftware提供解决方案