详细用法用 man crontab
查看。
crontab -l
列出当前用户的所有任务。
执行 crontab -e
可以进入任务编辑模式。
编辑模式下会有一些注释来解释用户需要写些什么东西,读完注释基本就会写了。命令调度的时间精度只能到分钟级别。
Crontab 的日志要用 sudo journalctl -u cron.service
来看。日志不由 rsyslog 管理。
要注意的地方:
>/dev/null 2>&1
让输出重定向到空文件,这样就没有信息可发送了。date
命令在写格式参数时要写成 date '+\%Y\%m\%d'
。在有 systemd 套件的系统上,journalctl 是日志管理组件。
cron 日志不由 syslog 管理,若有需要可以在 /etc/rsyslog.conf 文件或者 /etc/rsyslog.d 路径下的文件里手动配置:
#
# First some standard log files. Log by facility.
#
auth,authpriv.* /var/log/auth.log
,*.*;auth,authpriv.none -/var/log/syslog
#cron.* /var/log/cron.log
daemon.* -/var/log/daemon.log
kern.* -/var/log/kern.log
lpr.* -/var/log/lpr.log
mail.* -/var/log/mail.log
user.* -/var/log/user.log
取消相应注释后 sudo systemctl restart rsyslog
重启日志服务即可。
用 cat /etc/crontab
可以看到,它在执行脚本时默认使用 */bin/sh~ 而不是 /bin/bash ,环境变量也只有 PATH 一个。
这意味着所有默认针对 bash 的配置 (比如 /etc/profile) 在这里都不起作用。所以有些脚本在 bash 的命令行可以执行,但是用 cron 定时执行就会报错。
首先,可以在脚本里用到的路径写成绝对路径,不用环境变量的路径值。
第二,在脚本的开头手动导入环境变量:
#!/bin/sh
. /etc/profile
. ~/.bash_profile
第三,在 crontab 执行任务之前手动添加环境变量。比如:
0 * * * * . /etc/profile; /bin/bash ~/job.sh