Linux——Crontab

本文详细介绍了Crontab的基本概念、使用权限、命令格式及其参数,并提供了丰富的实例,帮助读者掌握如何设置复杂的定时任务。

名称 : crontab
使用权限 : 所有使用者
使用方式 :
crontab file [-u user]-用指定的文件替代目前的crontab。
crontab-[-u user]-用标准输入替代目前的crontab.
crontab-1[user]-列出用户目前的crontab.
crontab-e[user]-编辑用户目前的crontab.
crontab-d[user]-删除用户目前的crontab.
crontab-c dir- 指定crontab的目录。
crontab文件的格式:M H D m d cmd.
基本格式 :
*  *  *  *  *  command
分  时  日  月  周      命令
M: 分钟(0-59)。每分钟用*或者 */1表示
H:小时(0-23)。(0表示0点)
D:天(1-31)。
m: 月(1-12)。
d: 一星期内的天(0~6,0为星期天)。
cmd要运行的程序,程序被送入sh执行,这个shell只有USER,HOME,SHELL这三个环境变量
说明 :
crontab 是用来让使用者在固定时间或固定间隔执行程序之用,换句话说,也就是类似使用者的时程表。-u user 是指设定指定 user 的时程表,这个前提是你必须要有其权限(比如说是 root)才能够指定他人的时程表。如果不使用 -u user 的话,就是表示设定自己的时程表。

参数 :
crontab -e : 执行文字编辑器来设定时程表,内定的文字编辑器是 VI,如果你想用别的文字编辑器,则请先设定 VISUAL 环境变数来指定使用那个文字编辑器(比如说 setenv VISUAL joe)
crontab -r : 删除目前的时程表
crontab -l : 列出目前的时程表
crontab file [-u user]-用指定的文件替代目前的crontab。
时程表的格式如下 :
f1 f2 f3 f4 f5 program
其中 f1 是表示分钟,f2 表示小时,f3 表示一个月份中的第几日,f4 表示月份,f5 表示一个星期中的第几天。program 表示要执行的程序。
当 f1 为 * 时表示每分钟都要执行 program,f2 为 * 时表示每小时都要执行程序,其馀类推
当 f1 为 a-b 时表示从第 a 分钟到第 b 分钟这段时间内要执行,f2 为 a-b 时表示从第 a 到第 b 小时都要执行,其馀类推
当 f1 为 */n 时表示每 n 分钟个时间间隔执行一次,f2 为 */n 表示每 n 小时个时间间隔执行一次,其馀类推
当 f1 为 a, b, c,... 时表示第 a, b, c,... 分钟要执行,f2 为 a, b, c,... 时表示第 a, b, c...个小时要执行,其馀类推
使用者也可以将所有的设定先存放在档案 file 中,用 crontab file 的方式来设定时程表。

例子 :
#每天早上7点执行一次 /bin/ls :
0 7 * * * /bin/ls
在 12 月内, 每天的早上 6 点到 12 点中,每隔3个小时执行一次 /usr/bin/backup :

0 6-12/3 * 12 * /usr/bin/backup

周一到周五每天下午 5:00 寄一封信给 alex@domain.name :
0 17 * * 1-5 mail -s "hi" alex@domain.name < /tmp/maildata
每月每天的午夜 0 点 20 分, 2 点 20 分, 4 点 20 分....执行 echo "haha"
20 0-23/2 * * * echo "haha"
注意 :
当程序在你所指定的时间执行后,系统会寄一封信给你,显示该程序执行的内容,若是你不希望收到这样的信,请在每一行空一格之后加上 > /dev/null 2>&1 即可

例子2 :
#每天早上6点10分
10 6 * * * date
#每两个小时
0 */2 * * * date
#晚上11点到早上8点之间每两个小时,早上8点
0 23-7/2,8 * * * date
#每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点
0 11 4 * mon-wed date
#1月份日早上4点
0 4 1 jan * date


范例
$crontab -l 列出用户目前的crontab.

/usr /lib/cron/cron.allow表示谁能使用crontab命令。如果它是一个空文件表明没有一个用户能安排作业。如果这个文件不存在,而有另 外一个文件/usr/lib/cron/cron.deny,则只有不包括在这个文件中的用户才可以使用crontab命令。如果它是一个空文件表明任何 用户都可安排作业。两个文件同时存在时cron.allow优先,如果都不存在,只有超级用户可以安排作业。

crontab文件的一些例子:

30 21 * * * /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每晚的21:30重启apache。

45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每月1、10、22日的4 : 45重启apache。

10 1 * * 6,0 /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每周六、周日的1 : 10重启apache。

0,30 18-23 * * * /usr/local/etc/rc.d/lighttpd restart
上面的例子表示在每天18 : 00至23 : 00之间每隔30分钟重启apache。

0 23 * * 6 /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每星期六的11 : 00 pm重启apache。

* */1 * * * /usr/local/etc/rc.d/lighttpd restart
每一小时重启apache

* 23-7/1 * * * /usr/local/etc/rc.d/lighttpd restart
晚上11点到早上7点之间,每隔一小时重启apache

0 11 4 * mon-wed /usr/local/etc/rc.d/lighttpd restart
每月的4号与每周一到周三的11点重启apache

0 4 1 jan * /usr/local/etc/rc.d/lighttpd restart
一月一号的4点重启apache

例子:

每两个时间值中间使用逗号分隔。
除了数字还有几个个特殊的符号就是”*”、”/”和”-”、”,”,*代表所有的取值范围内的数字,”/”代表每的意思,”*/5″表示每5个单位,”-”代表从某个数字到某个数字,”,”分开几个离散的数字。

每天早上6点

0 6 * * * echo "Good morning." >> /tmp/test.txt //注意单纯echo,从屏幕上看不到任何输出,因为cron把任何输出都email到root的信箱了。

每两个小时

0 */2 * * * echo "Have a break now." >> /tmp/test.txt

晚上11点到早上8点之间每两个小时,早上八点

0 23-7/2,8 * * * echo "Have a good dream:)" >> /tmp/test.txt

每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点

0 11 4 * 1-3 command line

1月1日早上4点

0 4 1 1 * command line

每 次编辑完某个用户的cron设置后,cron自动在/var/spool/cron下生成一个与此用户同名的文件,此用户的cron信息都记录在这个文件 中,这个文件是不可以直接编辑的,只可以用crontab -e 来编辑。cron启动后每过一份钟读一次这个文件,检查是否要执行里面的命令。因此此文件修改后不需要重新启动cron服务。

2.编辑/etc/crontab 文件配置cron

cron 服务每分钟不仅要读一次/var/spool/cron内的所有文件,还需要读一次/etc/crontab,因此我们配置这个文件也能运用cron服务 做一些事情。用crontab配置是针对某个用户的,而编辑/etc/crontab是针对系统的任务。此文件的文件格式是:

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root //如果出现错误,或者有数据输出,数据作为邮件发给这个帐号
HOME=/        //使用者运行的路径,这里是根目录
# run-parts
01 * * * * root run-parts /etc/cron.hourly //每小时执行/etc/cron.hourly内的脚本
02 4 * * * root run-parts /etc/cron.daily //每天执行/etc/cron.daily内的脚本
22 4 * * 0 root run-parts /etc/cron.weekly //每星期执行/etc/cron.weekly内的脚本
42 4 1 * * root run-parts /etc/cron.monthly //每月去执行/etc/cron.monthly内的脚本

大家注意"run-parts"这个参数了,如果去掉这个参数的话,后面就可以写要运行的某个脚本名,而不是文件夹名了。

5,15,25,35,45,55 16,17,18 * * * command

这就是表示任意天任意月,其实就是每天的下午4点、5点、6点的5 min、15 min、25 min、35 min、45 min、55 min时执行命令。

[例] 在每周一,三,五的下午3:00系统进入维护状态,重新启动系统。那么在crontab 文件中就应该写入如下字段:

00 15 * * 1,3,5 shutdown -r +5

然后将该文件存盘为foxy.cron,再键入crontab foxy.cron安装该文件。

[例] 每小时的10分,40分执行用户目录下的innd/bbslin这个指令:

10,40 * * * * innd/bbslink

[例] 每小时的1分执行用户目录下的bin/account这个指令:

1 * * * * bin/account

[例] 每天早晨三点二十分执行用户目录下如下所示的两个指令(每个指令以;分隔):

20 3 * * * (/bin/rm -f expire.ls logins.bad;bin/expire$#@62;expire.1st)

[例] 每年的一月和四月,4号到9号的3点12分和3点55分执行/bin/rm -f expire.1st这个指令,并把结果添加在mm.txt这个文件之后(mm.txt文件位于用户自己的目录位置)。

12,55 3 4-9 1,4 * /bin/rm -f expire.1st$#@62;$#@62;mm.txt

[例] 我们来看一个超级用户的crontab文件:

#Run the ‘atrun’ program every minutes

#This runs anything that’s due to run from ‘at’.See man ‘at’ or ‘atrun’.

0,5,10,15,20,25,30,35,40,45,50,55 * * * * /usr/lib/atrun

40 7 * * * updatedb

8,10,22,30,39,46,54,58 * * * * /bin/sync

 

转自http://hi.baidu.com/cssalp/blog/item/6053572d554948444ec22668.html

<think>嗯,我收到了用户关于在Linux系统上安装和配置crontab的询问。仔细查看用户提供的站内引用内容,包含了几个重要的信息点:Linuxcrontab的存储位置有发行版差异、用户权限管理文件(cron.allow/cron.deny)、以及系统级和用户级crontab的区别。用户似乎是个Linux初学者,直接询问安装和使用方法,说明ta可能刚接触定时任务管理。考虑到crontab通常作为系统预装组件存在,这里需要明确告知用户:绝大多数Linux发行版已内置crontab,重点在于配置而非安装。准备分三部分回答用户:首先说明无需安装的情况(因为预装),再列出特殊情况下的安装命令(通过cronie软件包),然后详细说明配置方法。配置部分计划包括:1)系统级crontab的配置路径;2)用户级任务的编辑命令;3)权限管理文件的设置。要特别注意提醒Ubuntu/Debian和CentOS的路径差异,这恰好对应引用[1]提到的内容。对于使用示例,考虑设计几个实用场景:添加带注释的任务配置、查看现有任务列表、以及删除全部任务的警告提示。权限控制方面要强调引用[2][4]提到的allow/deny文件机制,特别是root用户不受黑名单限制的特性。在相关问题环节,根据引用内容延伸设计三个方向:定时任务保存位置的区别(用户级与系统级)、如何限制用户访问(对应权限控制文件)、cron与systemd定时器的对比(作为知识拓展)。这样既解决基础操作问题,又覆盖管理进阶需求。需要特别注意所有命令行和文件路径都用代码块标注,技术术语保持中英文对应。最后要添加配置生效的提醒——很多初学者会忽略重新加载的必要性。</think> 好的,在 Linux 系统中管理周期性任务离不开 `crontab`。幸运的是,**`crontab` 命令及其服务 `cron` 在几乎所有标准的 Linux 发行版中都是预安装的组件**。你通常不需要额外“安装”它,主要的操作在于**配置**和**使用**它来添加定时任务。 以下是详细的使用指南: ### 一、安装(通常不需要) 1. **检查是否安装:** * 打开终端。 * 输入以下命令查看 `crontab` 帮助或版本(这通常会确认命令存在): ```bash crontab -h # 或 crontab --version ``` * 检查 cron 服务状态(守护进程名称通常是 `cron` 或 `crond`): ```bash sudo systemctl status cron # Debian/Ubuntu 及其衍生版常用 # 或 sudo systemctl status crond # Red Hat/CentOS/SUSE 及其衍生版常用 ``` * 如果命令提示 `crontab: command not found` 或服务未安装(极少见情况),则需要安装。 2. **安装(仅在缺失时进行):** * **基于 Debian/Ubuntu 的系统:** ```bash sudo apt update sudo apt install cron ``` * **基于 Red Hat/CentOS/Fedora 的系统:** ```bash sudo yum install cronie # CentOS 7 / RHEL 7 及更老版本常用 yum # 或 sudo dnf install cronie # CentOS 8/RHEL 8, Fedora 常用 dnf ``` * 安装完成后,确保服务启动并设置开机自启: ```bash sudo systemctl start cron # 或 crond,根据上面状态检查确定 sudo systemctl enable cron # 或 crond ``` ### 二、配置与使用 crontab 核心操作是创建和编辑用户的 crontab 文件。 1. **编辑当前用户的任务:** ```bash crontab -e ``` * 首次运行会让你选择默认的文本编辑器(如 `nano`, `vim`)。选择熟悉的一个。 * 打开的编辑器里就是你的专属 crontab 文件。 2. **理解 crontab 语法:** crontab 文件中的每一行代表一个定时任务(注释行以 `#` 开头)。**任务行的基本格式如下:** ```bash * * * * * command-to-be-executed | | | | | | | | | ----- Day of week (0 - 6) (Sunday=0 或 7) | | | ------- Month (1 - 12) | | --------- Day of month (1 - 31) | ----------- Hour (0 - 23) ------------- Minute (0 - 59) ``` * 每个时间字段可以用: * 单个数字 (e.g., `5` 表示第5分钟/小时等) * 范围 (e.g., `1-5` 表示从1到5) * 逗号分隔的列表 (e.g., `1,3,5`) * 星号 `*` (表示“每”) * 步长值 `/<number>` (e.g., `*/10` 在分钟字段表示每10分钟) * 名称:月份或星期几有时可以用名称的前3个字母 (e.g., `mon`, `dec`) 3. **添加任务示例:** 假设你想: * **每天凌晨2点30分**清理 `/tmp` 目录下超过3天的文件: ```bash 30 2 * * * find /tmp -type f -mtime +3 -delete ``` * **每周一凌晨3点15分**备份家目录到 `/backups`: ```bash 15 3 * * 1 tar -zcf /backups/myhome_$(date +\%Y\%m\%d).tar.gz /home/username/ ``` * **重要:** `%` 在 crontab 中有特殊含义,需要转义为 `\%`。 * **每5分钟**发送一个包含当前时间的测试邮件给自己: ```bash */5 * * * * echo "Cron test at $(date)" | mail -s "Test Cron Job" your_email@example.com ``` (需要 `mailx` 或类似邮件客户端配置好) * **每小时运行一次**某个脚本(路径要写绝对路径): ```bash 0 * * * * /home/username/bin/my_script.sh ``` 4. **保存并生效:** * 在编辑器中输入你的任务行(按照上面的格式)。 * 保存文件(在 `nano` 中是 `Ctrl+O`,然后 `Enter`,`Ctrl+X` 退出;在 `vim` 中是 `:wq`)。 * **保存成功后,cron 守护进程会自动读取并加载你修改后的 crontab 文件。任务会按计划执行,无需额外重启服务(除非你修改了系统级别的crontab文件如 `/etc/crontab`)**。 5. **查看当前用户的任务列表:** ```bash crontab -l ``` 6. **删除当前用户的所有任务(谨慎操作!):** ```bash crontab -r ``` ### 三、高级配置与管理 1. **系统级 crontab (`/etc/crontab` 和 `/etc/cron.d/`):** * 不同于用户级 crontab (`crontab -e` 编辑的),系统级 crontab 文件需要 `root` 权限编辑(如 `sudo nano /etc/crontab`)。 * 系统级 crontab 文件 `/etc/crontab` 有一个额外的字段:**执行该命令的用户名**。格式如下: ```bash * * * * * username command-to-be-executed ``` * `/etc/cron.d/` 目录可以放置管理员创建的任意名称的 crontab 文件,格式与 `/etc/crontab` 相同(包含用户名字段)。这种方式便于模块化管理任务。 2. **预定义的时间间隔目录 (`/etc/cron.{hourly,daily,weekly,monthly}`):** * 这些目录存在(如 `/etc/cron.hourly`, `/etc/cron.daily` 等)。 * 只需将**可执行脚本或程序**(确保有执行权限)放入这些目录。 * `cron` 服务会按目录名代表的时间间隔(依赖 `/etc/crontab` 或 `/etc/anacrontab` 的配置)自动运行这些目录下的**所有**可执行文件。 * 好处:非常方便添加不需精确到分钟的任务;文件组织清晰。 3. **用户权限管理 (限制谁可以使用 `crontab`):** [^2][^4] * 通过文件 `/etc/cron.allow` (白名单) 和 `/etc/cron.deny` (黑名单) 控制。 * 如果 `/etc/cron.allow` **存在**:只有其中列出的用户名(每行一个)可以使用 `contab` 命令。 * 如果 `/etc/cron.allow` **不存在**: * 如果 `/etc/cron.deny` **存在**:所有未在该文件中列出的用户可以使用 `crontab`。 * 如果 `/etc/cron.deny` **不存在**:默认行为因系统而异,通常所有用户都能使用(或只有 root)。 * **`root` 用户始终不受限制。** * 管理:用文本编辑器(需要 sudo 权限)修改这两个文件即可(添加或删除用户名),立即生效。 ### 总结步骤 1. **确认安装:** `crontab -h` 或检查 cron/crond 服务状态。未安装则用发行版包管理器安装 `cron` 或 `cronie`。 2. **编写任务:** 使用 `crontab -e` 为当前用户编辑任务文件。遵循时间格式 `* * * * * command`。命令使用绝对路径,注意转义 `%`。 3. **保存生效:** 保存 `crontab -e` 编辑的文档后,cron 自动加载任务。 4. **验证:** 用 `crontab -l` 查看任务列表,观察任务是否能按预期执行(可能需要检查日志 `/var/log/syslog` 或 `/var/log/cron`)。 5. **(可选)** 如需系统级任务或限制用户,编辑 `/etc/crontab`, `/etc/cron.d/*` 或 `/etc/cron.{allow,deny}` 文件。 **关键提醒:** * **环境差异:** cron 任务运行的环境通常与你的登录 Shell 环境不同!PATH 环境变量尤其精简(通常只包含 `/usr/bin:/bin`)。**脚本或命令中最好使用绝对路径。** 在复杂脚本中考虑在开头显式设置必要的环境变量(如 `PATH`, `HOME`)。 * **权限:** 确保 cron 运行时的用户(当前用户或系统级任务指定的用户)对涉及的命令和文件有足够的执行和读/写权限。 * **日志:** 如果任务没有按预期执行,查看系统日志文件(`/var/log/syslog`, `/var/log/cron`, `/var/log/messages` - 具体文件取决于你的发行版和日志配置)是诊断问题的关键步骤。日志中通常会记录 cron 任务的执行、输出或错误信息。你可以通过邮件或者重定向任务输出到文件来捕获输出和错误信息,例如: ```bash * * * * * /path/to/script.sh > /tmp/cron_output.log 2>&1 ``` * **重新加载:** 虽然 `crontab -e` 保存后通常会自动加载,但如果你修改了 `/etc/crontab` 或 `/etc/cron.d/` 中的文件,一些系统可能需要重启 `cron` 服务才会生效(`sudo systemctl restart cron` / `crond`)。使用预定义的 `cron.hourly` 等目录方式则无需重启。 通过上述步骤,你应该能够顺利地在 Linux 系统上配置和管理 `crontab` 定时任务了。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值