Crontab 相关
1. 基础用法
详细用法用 man crontab
查看。
crontab -l
列出当前用户的所有任务。
执行 crontab -e
可以进入任务编辑模式。
编辑模式下会有一些注释来解释用户需要写些什么东西,读完注释基本就会写了。命令调度的时间精度只能到分钟级别。
Crontab 的日志要用 sudo journalctl -u cron.service
来看。日志不由 rsyslog
管理。
要注意的地方:
- 新创建的 cron job,不会马上执行,至少要过 2 分钟才执行。如果重启 cron 则马上将新任务加入计时器中。
- 每个任务执行完毕之后,系统会自动将输出发送邮件给当前系统用户,占很多硬盘空间。可以在每个命令后加
>/dev/null 2>&1
让输出重定向到空文件,这样就没有信息可发送了。 - crontab 中的
%
有特殊含义,表示换行。要用的话必须转义\%
,如date
命令在写格式参数时要写成date '+\%Y\%m\%d'
。 - 更新系统时间或时区后需要重启 cron。
2. 日志问题
在有 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
重启日志服务即可。
3. 环境变量问题
用 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