Crontab 相关 

Last Update: 2023-08-13

目录

基础用法

详细用法用 man crontab 查看。

crontab -l 列出当前用户的所有任务。

执行 crontab -e 可以进入任务编辑模式。

编辑模式下会有一些注释来解释用户需要写些什么东西,读完注释基本就会写了。命令调度的时间精度只能到分钟级别。

Crontab 的日志要用 sudo journalctl -u cron.service 来看。日志不由 rsyslog 管理。

要注意的地方:

  1. 新创建的 cron job,不会马上执行,至少要过 2 分钟才执行。如果重启 cron 则马上将新任务加入计时器中。
  2. 每个任务执行完毕之后,系统会自动将输出发送邮件给当前系统用户,占很多硬盘空间。可以在每个命令后加 >/dev/null 2>&1 让输出重定向到空文件,这样就没有信息可发送了。
  3. crontab 中的 % 有特殊含义,表示换行。要用的话必须转义 % ,如 date 命令在写格式参数时要写成 date '+\%Y\%m\%d'
  4. 更新系统时间或时区后需要重启 cron。

日志问题

在有 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