我们经常使用的是crontab命令是cron table的简写,它是cron的配置文件,也可以叫它作业列表。我们可以使用crontab来定时做一些事情,比如每天凌晨2点进行的定期备份。
我们可以在以下文件夹内找到相关配置文件。
/var/spool/cron/
目录下存放的是每个用户包括root的crontab任务,每个任务以创建者的名字命名/etc/crontab
这个文件负责调度各种管理和维护任务。/etc/cron.d/
这个目录用来存放任何要执行的crontab文件或脚本。/etc/cron.hourly
、/etc/cron.daily
、/etc/cron.weekly
、/etc/cron.monthly
目录中,让它每小时/天/星期、月执行一次。我们常用的命令如下:
crontab [-u username] //省略用户表表示操作当前用户的crontab
-e (编辑工作表)
-l (列出工作表里的命令)
-r (删除工作作)
我们用 crontab -e 进入当前用户的工作表编辑,是常见的vim界面。每行是一条命令。
我们用 crontab -l 列出当前用户的工作表所有命令
我们用 crontab -r 会从/var/spool/cron目录中删除某个用户的crontab文件,如果不指定用户,则默认删除当前用户的crontab文件,慎重操作
。
crontab的命令构成为 时间+动作,时间即cron表达式,动作即操作命令或脚本。例如:每1分钟执行一次myCommand
* * * * * myCommand
Cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域,每一个域代表一个含义,Cron有如下两种
Minutes Hours DayofMonth Month DayofWeek
当然这里讲的只是 Crontab 而不是其他的,比如 Quartz Cron 等。
例如要表示每隔 1 分钟执行一次
,则cron写法如下:
* * * * * command
下面我们来解释各个域代表的值以及允许的值:
域 | 允许的数值 | 允许的特殊字符 | 备注 |
---|---|---|---|
分Minutes | 0-59 | - * / | |
小时Hours | 0-23 | - * / | |
日期DayofMonth | 1-31 | - * / L W C | |
月份Month | 1-12 | JAN-DEC - * / | |
星期DayofWeek | 1-7 | SUN-SAT - * / | 1 表示星期天,2 表示星期一,依次类推 |
Minutes(分): 可以用数字0-59 表示。
Hours(时): 可以用数字0 - 23表示。
Day-of-Month(天) : 可以用数字1 - 31 中的任一一个值,但要注意一些特别的月份。
Month(月): 可以用0 - 11 或用字符串 JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV and DEC”
表示。
Day-of-Week(每周): 可以用数字1 - 7表示(1 = 星期日)或用字符口串SUN, MON, TUE, WED, THU, FRI and SAT
表示。
* 表示所有值,代表整个时间段。
- 表示一个指定的范围,例如 2-6
表示 2,3,4,5,6
。
, 表示附加一个可能值,例如:1,2,5,7,8,9。
/ 符号前表示开始时间,符号后表示每次递增的值; 可以用正斜线指定时间的间隔频率,例如 0-23/2
表示每两小时执行一次。同时正斜线可以和星号一起使用,例如 */10
,如果用在minute
字段,表示每十分钟执行一次。
*/5 * * * * 每隔5分钟执行一次
0 */1 * * * 每隔1小时执行一次
0 5-15 * * * 每天5-15点整点触发
0/3 * * * * 每三分钟触发一次
0-5 14 * * * 在每天下午2点到下午2:05期间的每1分钟触发
0/5 14 * * * 在每天下午2点到下午2:55期间的每5分钟触发
0/5 14,18 * * * 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
0/30 9-17 * * * 朝九晚五工作时间内每半小时
0 10,14,16 * * * 每天上午10点,下午2点,4点
15,30,45 * * * * 每15分钟,30分钟,45分钟时触发任务
0/3 * * * * 每小时的第0分0秒开始,每三分钟触发一次
通过crontab 命令,我们可以在固定的间隔时间执行指定的系统指令或 shell script脚本。 时间间隔的单位可以是分钟、小时、日、月、周及以上的任意组合。 这个命令非常设合周期性的日志分析或数据备份等工作。
php artisan make:command Test
make:command
命令会在 app/Console/Commands 目录中创建一个新的命令类。如果command目录不存在,它会在你第一次运行 make:command
命令时自动创建。生成的命令将包含所有命令中默认存在的属性和方法。
namespace App\Console\Commands;
use Illuminate\Console\Command;
class Test extends Command
{
// 此处省略部分默认生成代码...
/**
* Execute the console command.
*
* @return int
*/
public function handle()
{
\Log::info("Test");
return 0;
}
}
你可以在 App\Console\Kernel
类的 schedule
方法中定义所有调度任务。让我们从一个调度任务的例子开始,在这个例子中,我们会调用 Test
命令类执行,每隔1分钟打印出 Test
日志。
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 = [
//
];
/**
* Define the application's command schedule.
*
* @param \Illuminate\Console\Scheduling\Schedule $schedule
* @return void
*/
protected function schedule(Schedule $schedule)
{
$schedule->command('command:test')->cron('*/1 * * * *');
// $schedule->command('command:test')->everyMinute();
}
/**
* Register the commands for the application.
*
* @return void
*/
protected function commands()
{
$this->load(__DIR__.'/Commands');
require base_path('routes/console.php');
}
}
在定义完以上的任务之后,可以通过 php artisan schedule:run
来执行这些任务,但是,这个任务执行起来后,需要不断的执行这个这个命令定时器才能不断的运行,所以就需要 linux 的系统功能的帮助,在命令行下执行下面的命令:
crontab -e
* * * * * php /path/to/artisan schedule:run
* * * * * root /path/to/php /path/to/artisan schedule:run
上面一行中的 /path/to/php
和/path/to/artisan
需要改为实际的路径。
将Laravel项目部署至Linux服务器上,使用 crontab -l ,可以看到刚才编写过的命令
[wwwroot@xxx root]$ crontab -l
* * * * * /usr/local/php7/bin/php /wwwroot/cms/artisan schedule:run
上面命令的含义是每隔一分中就执行一下 schedule:run
命令。这样一来,前面定义的任务就可以不断的按照定义的时间间隔不断的执行,定时任务的功能也就实现了。
参考博客:https://learnku.com/laravel/t/1402/laravel-timing-task
https://lvwenhan.com/laravel-advanced/481.html