SDB:Cron
设置 cron 任务的位置和方法
有几个位置和方法可以安排您自己的 cron 任务。 有系统 crontab,例如 /etc/crontab 和 /etc/cron.d/ 目录,它们只能使用 root(但也可以为用户定义任务),以及通过 crontab -e 命令可供普通用户使用的用户 crontab。 在所有提到的情况下,您必须使用 crontab 定义,请参阅 字段。 如果您符合 每小时、分钟、每周或每月周期,则无需使用 crontab 定义。
crontab 字段
每行中每个字段的含义在上面的描述中涵盖(它也可能包含更多选项和字段 = 阅读全文)
| 分钟 | 小时 | 月份中的某天 | 月份 | 星期几 | 要执行的命令 |
| * | * | * | * | * | 要执行的命令 |
好吧,最简单的 cron 任务定义的含义并不那么简单 :)(命令将在每个小时的第一个分钟执行 00:01、01:01、02:01、03:01 ... 等)
1 * * * * /path/to/command
更有趣的示例使用斜杠 '/' 字符来定义步长(每 10 分钟执行一次命令)
*/10 * * * * /path/to/command
在 crontab 中,您还可以使用范围,使用 '-' 字符(每周工作日 7:30 执行)
30 7 * * 1-5 echo "Wake up, it's morning, go to work!" | sendmail username
也允许带有数字集合的列表(在第一和第十五执行)
* * 1,15 * * /path/to/command
对于星期几,您还可以使用:“Sun”、“Mon”、“Tue”、“Wed”、“Thu”、“Fri”、“Sat”、“Sun”)对于月份:“Jan”、“Feb”、“Mar”、“Apr”、“May”、“Jun”、“Jul”、“Aug”、“Sep”、“Oct”、“Nov”、“Dec”。
每周四下午 3:00 执行
0 15 * * * Thu echo "Hey! You have team meeting" | sendmail username
在第一和第十五以及每个星期天执行
* * 1,15 * Sun /path/to/command
如果 crontab 所有者的 uid 为 0(root),他还可以使用特殊选项来防止 cron 写入 syslog 消息,关于执行的命令; 如果您想使用此选项,请使用 '-' 作为 crontab 条目的第一个字符
- 1 * * * * username /usr/bin/test
crontab -e 命令
这是用户定义 cron 任务的最常见方法。 如果您想编辑 cron 任务,只需使用 crontab -e 命令。 它将打开首选(export EDITOR=vim)编辑器,其中包含已定义的 cronjob。 每行代表一个 cron 任务定义。 使用 crontab 命令,您还可以列出您的用户 cronjob crontab -l。
Crontab 定义位于 /var/spool/cron/tabs/
如果您手动检查用户 crontab 文件,您会发现我们的用户 crontab 中仍然存在僵尸
# DO NOT EDIT THIS FILE - edit the master and reinstall. # (/tmp/crontab.XXXXR637JH installed on Tue Apr 6 17:46:35 2010) # (Cronie version 1.4.4)
/etc/cron.d
这是为您的软件包创建 cron 任务规则的位置,并且您需要确切的执行日期/时间。 您的 crontab 规则可以是普通文件、符号链接或硬链接。 它必须由 root 拥有(也仅允许 root 写入)且不可执行。
在默认的 openSUSE 安装之后,您可以看到由一些软件包拥有的 crontab
ll /etc/cron.d/ total 8 -rw-r--r-- 1 root root 63 2009-10-13 19:44 novell.com-suse_register -rw-r--r-- 1 root root 268 2009-09-12 00:19 smolt
Cron job 规则在 syscrondir 中不由 cron 软件包本身拥有,例如:
# rpm -qf /etc/cron.d/smolt smolt-1.4-2.6.1.noarch
如您在下一个列表中看到的,syscrondir 中的文件包含标准的 cronjob 规则; 在每行中,我们必须指定一个用户(在本例中为 smolt)
# cat /etc/cron.d/smolt # Runs the smolt checkin client # Please note that calling with -c will cause smolt to pause a random amount of # time between 0 and 3 days before actually sending, this is to prevent ddos on # the server 20 1 1 * * smolt /usr/bin/smoltSendProfile -c > /dev/null 2>&1
/etc/crontab
在大多数情况下,用户不需要更改此文件。 安装后,系统 crontab 包含一个重要的规则,该规则启动 run-crons 脚本(此脚本执行 daily、hourly、weekly 目录中的所有脚本)。
# cat /etc/crontab SHELL=/bin/sh PATH=/usr/bin:/usr/sbin:/sbin:/bin:/usr/lib/news/bin MAILTO=root # # check scripts in cron.hourly, cron.daily, cron.weekly, and cron.monthly # -*/15 * * * * root test -x /usr/lib/cron/run-crons && /usr/lib/cron/run-crons >/dev/null 2>&1
cron.hourly cron.daily cron.weekly cron.monthly
当您想为您的软件包创建 cron 任务规则,并且不需要使用 crontab 规则来确定确切时间时,这是个好地方。 这些目录是安排以每日、每小时、每周或每月周期执行脚本的简单方法。 您只需将脚本(由 root 拥有,具有执行权限)推送到这些目录之一。 请参阅 daily cronjob 的列表,再次所有 crontab 文件都不由 cron 软件包拥有
#> ll /etc/cron.daily/ total 32 -rwxr-xr-x 1 root root 587 2009-10-24 05:20 logrotate -rwxr--r-- 1 root root 948 2009-10-24 05:50 suse-clean_catman -rwxr-xr-x 1 root root 1875 2003-09-01 13:10 suse.de-backup-rc.config -rwxr-xr-x 1 root root 2059 2003-09-08 15:50 suse.de-backup-rpmdb -rwxr-xr-x 1 root root 566 2004-07-23 12:38 suse.de-check-battery -rwxr-xr-x 1 root root 1314 2005-07-27 15:28 suse.de-clean-tmp -rwxr-xr-x 1 root root 371 2003-09-01 13:10 suse.de-cron-local -rwxr--r-- 1 root root 1693 2009-10-24 05:50 suse-do_mandb
如上所述,这些目录的处理由 shell 脚本 /usr/lib/cron/run-crons 提供。 此脚本由 cron 任务(在 /etc/crontab 中定义)每 15 分钟触发一次。 如果您有构建服务帐户,您可以查看 此处 的 run-crons 脚本。 基本上,它执行 /etc/sysconfig/cron(在 aaa_base 软件包中)以获取 sysconfig 设置,评估这些设置并在适当的时间段内执行提及的目录中的脚本。
cron 在文件系统中的各个部分
| /etc/cron.deny | 列在此文件中的用户无法使用 crontab -e 命令添加 cron 任务规则,但他们的 Cron 任务将被执行(如果已定义) |
| /etc/cron.allow | 如果此文件存在并且您想使用 crontab -e 命令,则您的用户必须添加到此文件 |
| /etc/crontab | 主 crontab |
| /etc/init.d/cron | cron init 脚本 |
| /etc/sysconfig/cron | init 脚本的 sysconfig,由 run-crons 脚本处理。 使用此配置,您可以更改处理放置在 /etc/cron.{hourly,daily,weekly,monhtly} 中的脚本的行为 |
| /etc/omc/srvinfo.d/cron.xml | 请参阅 omc 伞形项目 http://developer.novell.com/wiki/index.php/OMC |
| /usr/bin/crontab | 用于编辑用户 crontab 的命令(设置了 setuid 位) |
| /usr/lib/cron/run-crons | 此脚本每 15 分钟从主 crontab 执行一次,并处理放置在 /etc/cron.{hourly,daily,weekly,monhtly} 中的脚本 |
| /usr/sbin/cron | cron 守护进程二进制文件,由 init 脚本执行 |
| /usr/sbin/rccron | 只是一个链接到 /etc/init.d/cron |
| /var/spool/cron/lastrun | 此目录可以包含 cron.hourly、cron.daily、cron.weekly、cron.monthly 文件,这些文件标记了 /etc/cron.{hourly,daily,weekly,monthly} 中脚本的最后执行时间 |
| /var/spool/cron/tabs | 用户 crontab -- 仅 root 具有读取和写入权限 |
| /var/run/cron.pid | 当前运行的 cron 守护进程的 pid |
现有任务
cron.hourly
suse.de-snapper:如果TIMELINE_CREATE="yes"在 /etc/snapper/configs/ 中的配置文件中,则创建每小时快照
cron.daily
mdadm:每天运行 mdadm --monitor --oneshot 以确保未注意到的降级阵列。
packagekit-background.cron:(默认关闭) 使用 pkon 更新,或根据 pkon 中的设置检查更新/etc/sysconfig/packagekit-background
suse-clean_catman:根据 pkon 中的设置,每 7 天删除旧的预格式化 man 页面/etc/sysconfig/cron
suse-do_mandb:运行 mandb,根据 mandb 中的设置/etc/sysconfig/cron
suse.de-backup-rc.config:根据 mandb 中的设置,创建 sysconfig 文件的备份存档/etc/sysconfig/backup
suse.de-backup-rpmdb:根据 mandb 中的设置,创建 RPM 数据库的备份/etc/sysconfig/backup
suse.de-check-battery:检查 CMOS 电池。
suse.de-cron-local : ???
suse.de-snapper:运行 snapper 清理算法(编号、时间线、空前/空后),根据 /etc/sysconfig/snapper 中的设置/etc/sysconfig/snapper
cron.weekly
btrfs-balance:运行 btrfs balance,根据 btrfs balance 中的设置/etc/sysconfig/btrfsmaintenance
btrfs-trim:运行 fstrim,根据 fstrim 中的设置/etc/sysconfig/btrfsmaintenance
cron.monthly
btrfs-scrub:运行 btrfs scrub,根据 btrfs scrub 中的设置/etc/sysconfig/btrfsmaintenance
Cron 守护进程选项
debug cron
如果 cron 没有按您的意愿执行,请使用调试选项:停止 cron 守护进程,并使用带有附加的一个或多个调试标志的 -x 选项启动 cron 守护进程。 您还可以使用 -n 选项在前景中运行 cron 守护进程
# rccron stop # cron -nx pars,load
可用调试标志:ext、sch、proc、pars、load、misc、test、bit
内部链接
外部链接
- Cron Helper - 一个用户友好的 cron 语法工具