Crontab
Crontab 是linux用于执行定时程序的工具。
主要有两类,系统任务调度和用户任务调度。
- 系统任务调度:系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。一般在 
/etc/crontab里,用户一般不修改这一个。 - 用户任务调度:用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。用户可以用来定制自己的计划任务。据说保存在 
/var/spool/cron目录中。 
没找到什么合适的文档,直接 man crontab 吧。
一些文档:crontab(8),crontab(5),crontab(1),不如直接man。
命令参数
-u
crontab -u usr 表示指定某用户的计划任务
-e
crontab -e 编辑某个用户的 crontab 文件内容。如果不指定用户,则表示编辑当前用户的 crontab 文件。
-l
crontab -l 显示某个用户的 crontab 文件内容,不指定用户,则当前。
-r
crontab -r 从目录中删除某个用户的 crontab 文件,不指定,则当前。(-i:删除时给予确认提示)
文件释义
crontab 文件中,一行表一个任务,一行中有多个字段,前五个字段是时间设定,最后是命令段,命令段可以添加命令参数。
crontab 文件的文件头中,有一些执行路径、环境配置等,出问题的时候可以留意下。
时间字段:
一共五个,含义依次为:分、时、日、月、星期几。 * 为通配,周日的值是0。
操作符有:* 取值范围内的所有数字,/ 每过多少个数字,- 从X到Z,, 散列数字。
实例:
1  | * * * * * command #每分钟一次  | 
命令生成器:因为crontab不提示命令对错,经常会写错,可以直接用生成器生成对照。
扩展
时间字段有一些简单扩展
如:@reboot 每次重启,@yearly 每年,代替 0 0 1 1 * ,其他的有daily、hourly等。
1  | @daily /home/maverick/bin/cleanup-logs "day started"  | 
文件头
crontab 的文件头可以有环境配置
1  | # use /bin/sh to run commands, no matter what /etc/passwd says  | 
路径问题
用户个人的 crontab 路径是 /home/yourUsrName/ ,写相对路径,输出文件时要注意。如果不确定默认路径,写一个脚本执行一遍定时文件创建,查看输出到哪个位置。
日志
一般是默认没开的。
1  | sudo vim /etc/rsyslog.d/50-default.conf  | 
重定向
任务调度执行完毕后,系统会输出日志、发送通知邮件(现在好像不指定就不会发),如果是高频任务,日志量可能会很大,最好将日志输出忽略,标准输出重定向。
1  | >/dev/null 2>&1  | 
示例
定时创建文件
1  | crontab -e  | 
定时屏幕输出
如果编写 .sh ,在 crontab 内调用,未必能执行成功。如下:
1  | !/bin/sh  | 
1  | * * * * * sh /home/five/hello.sh  | 
大概率什么提示都看不到,而且 crontab 还没有错误提示。实际上 .sh 脚本会被执行,文件是会创建的。只是 notify-send 的屏幕输出没有。
解决类似问题,如果是单条提示,可以
1  | * * * * * XDG_RUNTIME_DIR=/run/user/$(id -u) notify-send "What you want to say."  | 
如果是脚本内调用量 notify-send ,那么在 .sh 里的环境变量写:
1  | #!/bin/sh  | 
我也不知道为什么,但是写了就可以。参考自:stackoverflow ,askubuntu
执行自动备份(rsync)
1  | 0 6 1 * * rsync -au /source/path /destination/path  | 
执行python脚本
指定python解释器的路径。其他什么php也大差不差。
1  | 0 9 * * * /usr/bin/python /opt/py/test.py >> /opt/py/cronTest.log  | 
其他注意
crontab中,%表换行,需要使用时注意转义\。- 慎用 
crontab -r,毕竟算是rm-rf。 






