
crontab是一个命令,常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令。
而 linux 任务调度的工作主要分为以下两类:
关于crontab的用途很多,如
Tips: 新创建的 cron 任务,不会马上执行,至少要过 2 分钟后才可以,当然你可以重启 cron 来马上执行。
crontab 是用来让使用者在固定时间或固定间隔执行程序之用,换句话说,也就是类似使用者的时程表或定时任务。
用法
crontab [-u user] file
# Or
crontab [ -u user ] [ -i ] { -e | -l | -r }
参数
-u user # 是指设定指定 user 的时程表,这个前提是你必须要有其权限(比如说是 root)才能够指定他人的时程表。如果不使用 -u user 的话,就是表示设定自己的时程表。
-i # 在删除用户的定时任务前提示 (prompt before deleting user's crontab)
-e # 编辑用户的定时任务列表,保存会检查任务配置是否符合规则。 (等同打开任务列表配置文件,路径 `/var/spool/cron/` 下,文件以用户名命名,如 /var/spool/cron/root)
-l # 列出用户的定时任务列表
-r # 删除用户的定时任务列表
验证网站: https://crontab.guru/
.--------------------- 分 minute (0 - 59)
| .------------------ 时 hour (0 - 23)
| | .--------------- 日 day of month (1 - 31)
| | | .------------ 月 month (1 - 12) OR jan,feb,mar,apr,may,jun,jul,aug,sept,oct,nov,dec
| | | | .--------- 周 day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
| | | | | .---- 执行的命令或程序
| | | | | |
* * * * * command-to-be-executed
1 列表示 “分钟” 0 - 592 列表示 “小时” 0 - 23 (0 表示 24点)3 列表示 “日期” 1 - 314 列表示 “月份” 1 - 12 或者用月份缩写,即 jan,feb,mar,apr,may,jun,jul,aug,sept,oct,nov,dec5 列表示 “星期” 0 - 6 (0 或 7 表示星期日) OR 或用周缩写,即 sun,mon,tue,wed,thu,fri,sat6 列是执行的 “命令或程序” (多个命令用分号 ; 隔开) 即 command1;command2* 的格式介绍:
* 表示所有时间执行。
1 为 * 表示每分钟执行,2 为 * 表示每小时执行,以此类推n-m 表示 n 到 m 时间执行。
1 为 n-m 表示从第 n 到第 m 分钟执行,2 为 n-m 表示从第 n 到第 m 小时执行,以此类推a, b, c,... 表示第 a, b, c,... 时刻执行。
1 为 a, b, c 表示第 a, b, c...个分钟要执行,2 为 a, b, c 表示第 a, b, c...个小时要执行,以此类推*/n 表示每 n 时间间隔执行一次。
1 为 */n 表示每 n 分钟个时间间隔执行一次,2 为 */n 表示每 n 小时个时间间隔执行一次,以此类推Crontab 范例
| 格式 | 执行时间 |
|---|---|
* * * * * |
每分钟执行 |
*/10 * * * * |
每10分钟执行 |
0 * * * * |
每小时执行 |
0 0 * * * |
每天执行 |
0 0 * * 0 |
每周执行 |
0 0 1 * * |
每月执行 |
0 0 L * * |
每月底执行 |
0 0 1 1 * |
每年执行 |
如果不确定书写的定时任务是否符合需求,可以去此地址进行验证:
%% 在 crontab 是特殊符号,第一个 % 表示
标准输入(STDIN)的开始,其他 % 用于表示crontab条目中的一个新行。
% 例子例1,一个 %
* * * * * cat >> /tmp/cat.txt 2>&1 % stdin input
输出如下
$ cat /tmp/cat.txt
stdin input
Tips: cat >> /tmp/cat.txt 作用是将标准输入重定向至/tmp/cat.txt。
例2,多个 %
* * * * * cat >> /tmp/cat_line.txt 2>&1 % stdin input 1 % stdin input 2 % stdin input 3
第一个 % 为标准输入开始,后面的 % 相当于换行符,故输出如下
$ cat /tmp/cat_line.txt
stdin input 1
stdin input 2
stdin input 3
% 使用如何将 crontab 行中的%作为
%而不是作为新行使用?
转义 %
* * * * * cat >> /tmp/cat_special.txt 2>&1 % per cent is \%. 2>&1
输出如下
$ cat /tmp/cat_special.txt
per cent is %.
shell脚本
将命令写入 shell脚本,然后 cron 执行 shell脚本即可避免 % 问题,shell脚本格式如下
#/bin/sh
command
通过 sed 传递文本
* * * * echo '% another \% minute \% has \% passed'| sed -e 's|\\|| g'
输出如下
% another % minute % has % passed
常用场景:
在crontab中使用MySQL命令时,这种技术非常有用。MySQL命令中经常出现 %,如下
SET @monyy=DATE_FORMAT(NOW(),"%M %Y")
SELECT * FROM table WHERE name LIKE 'fred%'
因此,要有一个crontab条目来运行MySQL命令
mysql -vv -e "SELECT * FROM table WHERE name LIKE 'Fred%'" member_list
将必须在crontab中显示为
echo "SELECT * FROM table WHERE name LIKE 'Fred\%'" | sed -e 's|\||g' | mysql -vv member_list
把crontab的拆开如下:
1. echo 命令将 MySQL命令发送到 STDOUT
2. sed 在将输出发送到 STDOUT 之前删除了任何 反斜杠(\)
3. mysql命令处理器从 STDIN 读取其命令。
命令是否正确
将执行结果重新向到日志文件并查看
* * * * * php /root/index.php >> /tmp/debug.log 2>&1
将命令部分直接在 shell 中执行并检查
任务是否执行
检查 crond 服务是否启动
service crond status # 查看
service crond start # 启动
service crond restart # 重启
查看日志,检查任务执行情况
crontab 日志文件位置: /var/log/cron ,部分内容如下
...
Dec 31 19:17:01 localhost crond[1455]: (CRON) bad day-of-week (/var/spool/cron/root) # /var/spool/cron/root的任务配置有错
Dec 31 19:17:01 localhost CROND[4409]: (root) CMD (date) ... # 12月21 19时17分1秒执行了date命令。
Ubuntu 默认不生成cron日志文件,需要手动开启 cron 日志,操作如下
# 1. 修改 系统日志(rsyslog)服务配置
$ sudo vim /etc/rsyslog.d/50-default.conf
然后找到 cron.* ,把前面的 # 去掉,保存退出
# 2. 重启 rsyslog 和 cron 服务
$ service rsyslog restart
$ service cron restart
根据时间列中值的不同设置方式,总结出以下五种类型:
1. 固定某值,指定固定值,如指定1月1日0时0分执行任务
0 0 1 1 * command
2. 列表值,时间值是一个列表,如指定一个月内2、12、22日0时执行任务
0 0 2,12,22 * * command
# 上述日指定多个值,2号、12号和22号,以英文逗号分隔;
3. 连续范围值,时间为连续范围的值,如指定每个月1至9号0时执行任务
0 0 1-9 * * command
# 上述日期为连续范围的值 1 到 9 号
4. 步长值,根据指定数值跳跃步长确定执行时间,如指定凌晨1时开始每割3个小时0分执行一次任务
0 0-23/3 * * * command
# 上述指定从凌晨0时每3个小时执行任务,如0点0分,4点0分,7点0分等。
5. 混合值,支持以上类型的组合,如指定每小时0至10分,22、33分以及0-60分钟每隔20分钟执行任务,如下
0-10,22,33,*/20 * * * * command
# 这里的分钟值采取了多种类型组合指定,包括连续范围值(0-10),列表值(22,33),步长值(*/20)。
在 12 月内, 每天的早上 6 点到 12 点,每隔 3 个小时 0 分钟执行一次 /usr/bin/backup:
0 6-12/3 * 12 * /usr/bin/backup
每月每天的午夜 0 点 20 分, 2 点 20 分, 4 点 20 分....执行 echo "haha":
20 0-23/2 * * * echo "haha"
特定的某几个月或某几天执行任务
* * * jan,may,aug * /script/script.sh
0 17 * * sun,fri /script/scripy.sh
多个任务在一条命令中配置
* * * * * /scripts/script.sh; /scripts/scrit2.sh
每年执行一次任务
@yearly /scripts/script.sh
系统重启时执行
@reboot /scripts/script.sh
Via
我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时
如何使用RSpec::Core::RakeTask初始化RSpecRake任务?require'rspec/core/rake_task'RSpec::Core::RakeTask.newdo|t|#whatdoIputinhere?endInitialize函数记录在http://rubydoc.info/github/rspec/rspec-core/RSpec/Core/RakeTask#initialize-instance_method没有很好的记录;它只是说:-(RakeTask)initialize(*args,&task_block)AnewinstanceofRake
我有一个在Linux服务器上运行的ruby脚本。它不使用rails或任何东西。它基本上是一个命令行ruby脚本,可以像这样传递参数:./ruby_script.rbarg1arg2如何将参数抽象到配置文件(例如yaml文件或其他文件)中?您能否举例说明如何做到这一点?提前谢谢你。 最佳答案 首先,您可以运行一个写入YAML配置文件的独立脚本:require"yaml"File.write("path_to_yaml_file",[arg1,arg2].to_yaml)然后,在您的应用中阅读它:require"yaml"arg
我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm
之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m
注意:本文主要掌握DCN自研无线产品的基本配置方法和注意事项,能够进行一般的项目实施、调试与运维AP基本配置命令AP登录用户名和密码均为:adminAP默认IP地址为:192.168.1.10AP默认情况下DHCP开启AP静态地址配置:setmanagementstatic-ip192.168.10.1AP开启/关闭DHCP功能:setmanagementdhcp-statusup/downAP设置默认网关:setstatic-ip-routegeteway192.168.10.254查看AP基本信息:getsystemgetmanagementgetmanaged-apgetrouteAP配
1.1.1 YARN的介绍 为克服Hadoop1.0中HDFS和MapReduce存在的各种问题⽽提出的,针对Hadoop1.0中的MapReduce在扩展性和多框架⽀持⽅⾯的不⾜,提出了全新的资源管理框架YARN. ApacheYARN(YetanotherResourceNegotiator的缩写)是Hadoop集群的资源管理系统,负责为计算程序提供服务器计算资源,相当于⼀个分布式的操作系统平台,⽽MapReduce等计算程序则相当于运⾏于操作系统之上的应⽤程序。 YARN被引⼊Hadoop2,最初是为了改善MapReduce的实现,但是因为具有⾜够的通⽤性,同样可以⽀持其他的分布式计算模
我写了一个非常简单的rake任务来尝试找到这个问题的根源。namespace:foodotaskbar::environmentdoputs'RUNNING'endend当在控制台中执行rakefoo:bar时,输出为:RUNNINGRUNNING当我执行任何rake任务时会发生这种情况。有没有人遇到过这样的事情?编辑上面的rake任务就是写在那个.rake文件中的所有内容。这是当前正在使用的Rakefile。requireFile.expand_path('../config/application',__FILE__)OurApp::Application.load_tasks这里
我是ruby的新手,正在配置IRB。我喜欢pretty-print(需要'pp'),但总是输入pp来漂亮地打印它似乎很麻烦。我想做的是默认情况下让它漂亮地打印出来,所以如果我有一个var,比如说,'myvar',然后键入myvar,它会自动调用pretty_inspect而不是常规检查。我从哪里开始?理想情况下,我将能够向我的.irbrc文件添加一个自动调用的方法。有什么想法吗?谢谢! 最佳答案 irb中默认pretty-print对象正是hirb被迫去做。Theseposts解释hirb如何将几乎所有内容转换为ascii表。虽
我想在IRB中浏览文件系统并让提示更改以反射(reflect)当前工作目录,但我不知道如何在每个命令后进行提示更新。最终,我想在日常工作中更多地使用IRB,让bash溜走。我在我的.irbrc中试过这个:require'fileutils'includeFileUtilsIRB.conf[:PROMPT][:CUSTOM]={:PROMPT_N=>"\e[1m:\e[m",:PROMPT_I=>"\e[1m#{pwd}>\e[m",:PROMPT_S=>"FOO",:PROMPT_C=>"\e[1m#{pwd}>\e[m",:RETURN=>""}IRB.conf[:PROMPT_MO