Linux 每分钟、每小时、每天、每周、每月、每年定时执行
http://blog.sina.com.cn/s/blog_ada5953f0102xfn9.html
flock防止crontab重复执行脚本
https://blog.csdn.net/xiaoxiong_web/article/details/77451840?utm_source=blogxgwz7
两星期一次:
https://bbs.csdn.net/topics/360030731
每周一执行一个脚本:0 6 1-7,15-21 * * if [ `date '+\%w'` = "1" ]; then 调用你的脚本;fi
This is my answer about cronjob setup:
0 7 * * 2 [[ $((`date +%W`%2)) == 0 ]] && ls -l
0 7 * * 2 [[ $((`date +%W`%2)) == 1 ]] && ls -l
OR
0 7 * * 2 if [[ $((`date +%W`%2)) == 0 ]]; then ls -l; fi
0 7 * * 2 if [[ $((`date +%W`%2)) == 1 ]]; then ls -l; fi
"ls -l" is what we want to do.
crontab 各参数详解及如何查看日志记录
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt145
crontab各参数说明:
crontab [-u user] [file]
crontab [-u user] [-e|-l|-r]
crontab -l -u root 查看root用户的任务表
注意crontab是分用户的,以谁登录就会编辑到谁的crontab
-e : 执行文字编辑器来编辑crontab,内定的文字编辑器是VI
-r : 删除目前的crontab
-l : 列出目前的crontab(查看专用)
-i : 会和-r 配合使用,在删除当前的crontab时询问,输入y 则删除
/etc/init.d/crond restart(stop/start)重启或者停止后再启动
备份命令:
应用:对crontab进行备份crontab -l>/home/backup/crontab/crontab`date '+%Y%m%d'`.bak
22 21 * * * /usr/bin/backup
crontab 中文乱码
crontab启动的任务没有获取系统的环境变量,导致中文乱码
解决办法:
在执行的脚步中添加编码方式或者添加对应的环境变量
如:
1、/usr/bin/java -Dfile.encoding=UTF-8 -jar ALDTool.jar
2、在脚本开头增加:
export LANG="en_US.UTF-8"
crontab特殊的符号说明:
"*"代表所有的取值范围内的数字。特别要注意哦!
"/"代表每的意思,如"*/5"表示每5个单位
"-"代表从某个数字到某个数字
","分散的数字
crontab文件的使用示例:
30 21 * * * 表示每晚的21:30
45 4 1,10,22 * * 表示每月1、10、22日的4 : 45
10 1 * * 6,0 表示每周六、周日的1 : 10
0,30 18-23 * * * 表示在每天18 : 00至23 : 00之间每隔30分钟
0 23 * * 6 表示每星期六的11 : 00 pm
* */1 * * * 每一小时
* 23-7/1 * * * 晚上11点到早上7点之间,每隔一小时
* 8,13 * * 1-5 从周一到周五的上午8点和下午1点
0 11 4 * mon-wed 每月的4号与每周一到周三的11点
0 4 1 jan * 一月一号的4点
-------------------------------- 如何查看crontab的日志记录 --------------------------------------------------------
昨天crontab中的同步任务没有执行,不知道是什么原因没有执行,貌似任务hang住了,想查询一下crontab到底问题出在哪里,或者hang在了什么地方。
如:30 12 * * * /data/bk/bk.sh >/tmp/test.log 2>&1 &
将crontab运行日志输出到/tmp/test.log中
1. linux
看 /var/log/cron这个文件就可以,可以用tail -f /var/log/cron观察
2. unix
在 /var/spool/cron/tmp文件中,有croutXXX001864的tmp文件,tail 这些文件就可以看到正在执行的任务了。
3. mail任务
在 /var/spool/mail/root 文件中,有crontab执行日志的记录,用tail -f /var/spool/mail/root 即可查看最近的crontab执行情况。
=====================================================================================
yum install crontabs
rpm -q crontabs
ll /var/spool/cron == crontab -l
=====================================================================================
2.2 Crontab 格式说明
我们可以用crontab -e 添加要执行的命令。 命令执行的结果,无论是标准输出还是错误输出,都将以邮件形式发给用户。
添加的命令必须以如下格式:
* * * * * /command path
前五个字段可以取整数值,指定何时开始工作,第六个域是字符串,即命令字段,其中包括了crontab调度执行的命令。 各个字段之间用spaces和tabs分割。
前5个字段分别表示:
分钟:0-59
小时:1-23
日期:1-31
月份:1-12
星期:0-6(0表示周日)
还可以用一些特殊符号:
*: 表示任何时刻
,: 表示分割
-:表示一个段,如第二端里: 1-5,就表示1到5点
/n : 表示每个n的单位执行一次,如第二段里,*/1, 就表示每隔1个小时执行一次命令。也可以写成1-23/1.
一些示例:
00 8,12,16 * * * /data/app/scripts/monitor/df.sh
30 2 * * * /data/app/scripts/hotbackup/hot_database_backup.sh
10 8,12,16 * * * /data/app/scripts/monitor/check_ind_unusable.sh
10 8,12,16 * * * /data/app/scripts/monitor/check_maxfilesize.sh
10 8,12,16 * * * /data/app/scripts/monitor/check_objectsize.sh
43 21 * * * 21:43 执行
15 05 * * * 05:15 执行
0 17 * * * 17:00 执行
0 17 * * 1 每周一的 17:00 执行
0,10 17 * * 0,2,3 每周日,周二,周三的 17:00和 17:10 执行
0-10 17 1 * * 毎月1日从 17:00到7:10 毎隔1分钟 执行
0 0 1,15 * 1 毎月1日和 15日和 一日的 0:00 执行
42 4 1 * * 毎月1日的 4:42分 执行
0 21 * * 1-6 周一到周六 21:00 执行
0,10,20,30,40,50 * * * * 每隔10分 执行
*/10 * * * * 每隔10分 执行
* 1 * * * 从1:0到1:59 每隔1分钟 执行
0 1 * * * 1:00 执行
0 */1 * * * 毎时0分 每隔1小时 执行
0 * * * * 毎时0分 每隔1小时 执行
2 8-20/3 * * * 8:02,11:02,14:02,17:02,20:02 执行
30 5 1,15 * * 1日 和 15日的 5:30 执行
2.3 & 后台执行命令
当在前台运行某个作业时,终端被该作业占据;而在后台运行作业时,它不会占据终端。可以使用&命令把作业放到后台执行。
如:
30 2 * * * /data/app/scripts/hotbackup/hot_database_backup.sh &
在后台运行作业时要当心:需要用户交互的命令不要放在后台执行,因为这样你的机器就会在那里傻等。
不过,作业在后台运行一样会将结果输出到屏幕上,干扰你的工作。如果放在后台运行的作业会产生大量的输出,最好使用下面的方法把它的输出重定向到某个文件中:
如:
command >out.file 2>&1 &
在这个例子中,2>&1表示所有的标准输出和错误输出都将被重定向到一个叫做out.file 的文件中。
2.4 2>&1 含义
先看一个例子:
0 2 * * * /u01/test.sh >/dev/null 2>&1 &
这句话的意思就是在后台执行这条命令,并将错误输出2重定向到标准输出1,然后将标准输出1全部放到/dev/null 文件,也就是清空。
在这里有有几个数字的意思:
0表示键盘输入
1表示标准输出
2表示错误输出.
我们也可以这样写:
0 2 * * * /u01/test.sh >/u01/out.file & –这里没写,默认是1
0 2 * * * /u01/test.sh 1>/u01/out.file &
0 2 * * * /u01/test.sh 2>/u01/out.file &
0 2 * * * /u01/test.sh 2>/u01/out.file 2>&1 &
将tesh.sh 命令输出重定向到out.file, 即输出内容不打印到屏幕上,而是输出到out.file文件中。
2>&1 是将错误输出重定向到标准输出。 然后将标准输入重定向到文件out.file。
&1 表示的是文件描述1,表示标准输出,如果这里少了&就成了数字1,就表示重定向到文件1。
& :后台执行
测试:
ls 2>1 : 不会报没有2文件的错误,但会输出一个空的文件1;
ls xxx 2>1: 没有xxx这个文件的错误输出到了1中;
ls xxx 2>&1: 不会生成1这个文件了,不过错误跑到标准输出了;
ls xxx >out.txt 2>&1 == ls xxx 1>out.txt 2>&1; 因为重定向符号>默认是1,这句就把错误输出和标准输出都传到out.txt 文件中。
2.5 2>&1写在后面的原因
格式:command > file 2>&1 == command 1> file 2>&1
首先是command > file将标准输出重定向到file中, 2>&1 是标准错误拷贝了标准输出,也就是同样被重定向到file中,最终结果就是标准输出和错误都被重定向到file中。
如果改成: command 2>&1 >file
2>&1 标准错误拷贝了标准输出的行为,但此时标准输出还是在终端。>file 后输出才被重定向到file,但标准错误仍然保持在终端。
博客已转移至 http://blog.yemou.net/
sudo service cron reload
sudo service cron restart
crontab -e
crontab -l
每五分钟执行 */5 * * * *
每小时执行 0 * * * *
每天执行 0 0 * * *
每周执行 0 0 * * 0
每月执行 0 0 1 * *
每年执行 0 0 1 1 *
1.作用
使用crontab命令可以修改crontab配置文件,然后该配置由cron公用程序在适当的时间执行,该命令使用权限是所有用户。
2.格式
crontab [-u user] {-l | -r | -e}
3.主要参数
-e:执行文字编辑器来设定时程表,内空的文字编辑器是vi
-r:删除目前的时程表
-l列出目前的时程表。
Crontab文件的格式为”M H D m d cmd”。其中,M代表分钟(0~59),H代表小时(0~23),D代表天(1~31),m代表月(1~12),d代表一星期内的天(0~6,0为星期天)。Cmd表示要运行的程序,它被送入sh执行,这个shell只有USER、HOME、SHELL三个环境变量。
使用cron服务,用server crond status查看cron服务状态,如果没有启动则service crond start启动它,cron服务是一个定时执行的服务,可以通过crontab命令添加或编辑需要定时执行的任务:
crontab –u //设定某个用户的cron服务,一般root用户在执行这个命令的时候需要此参数
crontab –l //列出某个用户cron服务的详细内容
crontab –r //删除某个用户的cron服务
crontab –e //编辑某个用户的cron服务
crontab filename //以filename作为crontab的任务列表文件并载入
比如说root查看自己的cron设置:crontab –u root –l
再例如,root想删除fred的cron设置:crontab –u fred –r
在编辑cron服务时,编辑的内容有一些格式和约定,输入:crontab –u root –e
进入vi编辑模式,编辑的内容一定要符合下面的格式:
*/1 * * * * ls >>/tmp/ls.txt
编辑/etc/crontab文件,在末尾加上一行:30 5 * * * root init 6这样就将系统配置为每天早上5点30分自动重新启动。
crontab 文件中的行由6个字段组成,不同字段间用空格或tab键分隔。前5个字段指定命令要运行的时间
分钟(0-59)
小时(0-23)
日期(1-31)
月份(1-12)
星期几(0-6,其中0代表星期日,好像7也代表星期日)
第6个字段是一个要在适当时间执行的字符串。
例子:
#MIN HOUR DAY MONTH DAYOFWEEK COMMAND
#每天早上6点10分
10 6 * * * date
#每两个小时
0 */2 * * * date
#晚上11点到早上8点之间每两个小时,早上8点
0 23-7/2,8 * * * date
#每个月的4号和每个礼拜一到礼拜三的早上11点
0 11 4 * 1-3 date
#1月1日早上4点
0 4 1 1 * date
补充:在使用crontab的时候,要特别注意的是运行脚本中能够访问到的环境变量和当前测试环境中环境变量未必一致,一个比较保险的做法是在运行的脚本程序中自行设置环境变量(export)
(1) 先建一个文件crond.txt如下,每天早上5点36分重新启动
36 5 * * * reboot
(2)上传到/opt目录
(3)运行命令
crontab /opt/crond.txt
crontab –l
让配置文件生效:如果让配置文件生效,还得重新启动cron,切记,既然每个用户下的cron配置文件修改后,也要重新启动cron服务器。
在Fedora和Redhat中,我们应该用:
/etc/rc.d/crond restart
如果让crond在开机时运行,应该改变其运行级别:
chkconfig –level 35 crond on
service crond status查看cron服务状态,如果没有启动则service crond start启动它,cron服务是一个定时执行的服务,可以通过crontab命令添加或者编辑需要定时执行的任务
1. # 下午6点到早上6点,每隔15分钟执行一次脚本
0,15,30,45 18-06 * * * /bin/bash $HOME/script.sh > /dev/null 2>&1# 每两小时,重启一次服务* */2 * * * /etc/init.d/apache2 restart
下面是每隔多少分钟,每隔多少小时,每天/每周/每月/每年的crontab的归纳总结
如果说是每个月的每隔10天来执行某个脚本的话,同样可以写成:
?
但如果是按自然天数,比如说每27天,执行一次脚本,这个要如何实现呢? 如果是这种情况,显然不能通过crontab直接实现,必须迂回实现。
下面是能想到的两种方法。
【方法一】通过脚本控制时间来实现
思路:
1) 在脚本running.sh中设置要执行的次数,这里假如10次,每次间隔27天,script.sh为要执行的脚本
2) 然后执行nohup bash running.sh &将其放置在后台让其自动执行
【方法二】通过crontab间接实现
思路:
1) 每天定时执行running.sh脚本,再在脚本running.sh里面判断,当间隔时间满足条件时
2) 执行script.sh脚本,同时修改上次执行时间,以便于下次执行
-
每五分钟执行 */5 * * * *
-
每五小时执行 0 */5 * * *
-
每天执行 0 0 * * *
-
每周执行 0 0 * * 0
-
每月执行 0 0 1 * *
-
每年执行 0 0 1 1 *
- 12
- # 每个月的1号,11号,21号,31号,执行HTTP服务重启0 0 */10 * * /etc/init.d/apache2 restart