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
。