Crontab

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
2
3
* * * * * command			#每分钟一次
3,15 8-11 */2 * * command #每两天,在8-11点的3分和15分时执行
* 7-22/5 * * 6,0 command #每周六日,7-21点每5小时执行一次

命令生成器:因为crontab不提示命令对错,经常会写错,可以直接用生成器生成对照。

扩展

时间字段有一些简单扩展

如:@reboot 每次重启,@yearly 每年,代替 0 0 1 1 * ,其他的有daily、hourly等。

1
@daily /home/maverick/bin/cleanup-logs "day started"

文件头

crontab 的文件头可以有环境配置

1
2
3
4
5
6
# use /bin/sh to run commands, no matter what /etc/passwd says
SHELL=/bin/sh
# mail any output to 'five', no matter whose crontab this is
MAILTO=five
#
CRON_TZ=China

路径问题

用户个人的 crontab 路径是 /home/yourUsrName/ ,写相对路径,输出文件时要注意。如果不确定默认路径,写一个脚本执行一遍定时文件创建,查看输出到哪个位置。

日志

一般是默认没开的。

1
2
3
4
sudo vim /etc/rsyslog.d/50-default.conf
cron.* /var/log/cron.log #将cron前面的注释符去掉
sudo service rsyslog restart #重启rsyslog
sudo service cron restart #重启cron

重定向

任务调度执行完毕后,系统会输出日志、发送通知邮件(现在好像不指定就不会发),如果是高频任务,日志量可能会很大,最好将日志输出忽略,标准输出重定向。

1
2
>/dev/null 2>&1
> /home/username/crontab.log

示例

定时创建文件

1
2
crontab -e
* 6 * * * touch test.log

定时屏幕输出

如果编写 .sh ,在 crontab 内调用,未必能执行成功。如下:

1
2
3
#!/bin/sh
notify-send "hello world!"
touch test.log
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
2
3
#!/bin/sh
export XDG_RUNTIME_DIR=/run/user/$(id -u)
export DISPLAY=:0

我也不知道为什么,但是写了就可以。参考自:stackoverflowaskubuntu

执行自动备份(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
作者

ivy

发布于

2021-11-02

更新于

2023-03-25

许可协议

CC BY-NC-SA 4.0

评论