【运维】Linux定时任务 定时执行脚本在安装完成操作系统后默认会安装 crond 服务工具且 crond 服务默认就是自启动的。crond 进程每分钟会定期检查是否有要执行的任务如果有则会自动执行该任务。五分钟执行一次sh脚本进入编辑页面crontab -e按Insert 进行编辑# 每两分钟执行一次*/2 * * * * /usr/local/start.sh依次按 :wq 进行保存 即时生效重启service crond restart#设定crond服务为开机自启动chkconfig crond on接下来在介绍 crontab 命令。该命令和 at 命令类似也是通过 /etc/cron.allow 和 /etc/cron.deny 文件来限制某些用户是否可以使用 crontab 命令的。而且原则也非常相似当系统中有 /etc/cron.allow 文件时只有写入此文件的用户可以使用 crontab 命令没有写入的用户不能使用 crontab 命令。同样如果有此文件/etc/cron.deny 文件会被忽略因为 /etc/cron.allow 文件的优先级更高。当系统中只有 /etc/cron.deny 文件时写入此文件的用户不能使用 crontab 命令没有写入文件的用户可以使用 crontab 命令。这个规则基本和 at 命令的规则一致同样是 /etc/cron.allow 文件比 /etc/cron.deny 文件的优先级高Linux 系统中默认只有 /etc/cron.deny 文件。每个用户都可以实现自己的 crontab 定时任务只需使用这个用户身份执行“crontab -e”命令即可。当然这个用户不能写入 /etc/cron.deny 文件。crontab 命令的基本格式如下[rootlocalhost ~]# crontab [选项] [file]注意这里的 file 指的是命令文件的名字表示将 file 作为 crontab 的任务列表文件并载入 crontab若在命令行中未指定文件名则此命令将接受标准输入键盘上键入的命令并将它们键入 crontab。与此同时表 1 罗列出了此命令常用的选项及功能。表 1 crontab 命令常用选项及功能选项功能-u user用来设定某个用户的 crontab 服务例如 -u demo 表示设备 demo用户的 crontab 服务此选项一般有 root 用户来运行。-e编辑某个用户的 crontab 文件内容。如果不指定用户则表示编辑当前用户的 crontab 文件。-l显示某用户的 crontab 文件内容如果不指定用户则表示显示当前用户的 crontab 文件内容。-r从 /var/spool/cron 删除某用户的 crontab 文件如果不指定用户则默认删除当前用户的 crontab 文件。-i在删除用户的 crontab 文件时给确认提示。其实 crontab 定时任务非常简单只需执行“crontab -e”命令然后输入想要定时执行的任务即可。不过当我们执行“crontab -e”命令时打开的是一个空文件而且操作方法和 Vim 是一致的。那么这个文件的格式才是我们真正需要学习的内容。文件格式如下[rootlocalhost ]# crontab -e#进入 crontab 编辑界面。会打开Vim编辑你的任务* * * * * 执行的任务这个文件中是通过 5 个“*”来确定命令或任务的执行时间的这 5 个“*”的具体含义如表 2 所示。表 2 crontab 时间表示项目含义范围第一个*一小时当中的第几分钟minute0~59第二个*一天当中的第几小时hour0~23第三个*一个月当中的第几天day1~31第四个*一年当中的第几个月month1~12第五个*一周当中的星期几week0~70和7都代表星期日在时间表示中还有一些特殊符号需要学习如表 3 所示。表 3 时间特殊符号特殊符号含义*星号代表任何时间。比如第一个*就代表一小时种每分钟都执行一次的意思。,逗号代表不连续的时间。比如0 81216***命令就代表在每天的 8 点 0 分、12 点 0 分、16 点 0 分都执行一次命令。-中杠代表连续的时间范围。比如0 5 ** 1-6命令代表在周一到周六的凌晨 5 点 0 分执行命令。/正斜线代表每隔多久执行一次。比如*/10****命令代表每隔 10 分钟就执行一次命令。当“crontab -e”编辑完成之后一旦保存退出那么这个定时任务实际就会写入 /var/spool/cron/ 目录中每个用户的定时任务用自己的用户名进行区分。而且 crontab 命令只要保存就会生效只要 crond 服务是启动的。知道了这 5 个时间字段的含义我们多举几个时间的例子来熟悉一下时间字段如表 4 所示。表 4 crontab举例时间含义45 22 ***命令在 22 点 45 分执行命令0 17 ** 1命令在每周一的 17 点 0 分执行命令0 5 115**命令在每月 1 日和 15 日的凌晨 5 点 0 分执行命令40 4 ** 1-5命令在每周一到周五的凌晨 4 点 40 分执行命令*/10 4 ***命令在每天的凌晨 4 点每隔 10 分钟执行一次命令0 0 115 * 1命令在每月 1 日和 15 日每周一个 0 点 0 分都会执行命令注意星期几和几日最好不要同时出现因为它们定义的都是天非常容易让管理员混淆现在我们已经对这 5 个时间字段非常熟悉了可是在“执行的任务”字段中都可以写什么呢既可以定时执行系统命令也可以定时执行某个 Shell 脚本这里举几个实际的例子。【例 1】让系统每隔 5 分钟就向 /tmp/test 文件中写入一行“11”验证一下系统定时任务是否会执行。[rootlocalhost ~]# crontab -e#进入编辑界面*/5 * * * * /bin/echo 11 /tmp/test这个任务在时间工作中没有任何意义但是可以很简单地验证我们的定时任务是否可以正常执行。如果觉得每隔 5 分钟太长那就换成“*”让它每分钟执行一次。而且和 at 命令一样如果我们定时执行的是系统命令那么最好使用绝对路径。【例 2】让系统在每周二的凌晨 5 点 05 分重启一次。[rootlocalhost ~]# crontab -e5.5 * * 2 /sbin/shutdown -r now如果服务器的负载压力比较大则建议每周重启一次让系统状态归零。比如绝大多数游戏服务器每周维护一次维护时最主要的工作就是重启让系统状态归零。这时可以让我们的服务器自动来定时执行。【例 3】在每月 1 日、10 日、15 日的凌晨 3 点 30 分都定时执行日志备份脚本 autobak.sh。[rootlocalhost ~]# crontab -e30.3 11015 * * /root/sh/autobak.sh这些定时任务保存之后就可以在指定的时间执行了。我们可以使用命令来查看和删除定时任务命令如下[rootlocalhost ~]# crontab -l#查看root用户的crontab任务*/5 * * * * /bin/echo 11 /tmp/test5.5 * * 2 /sbin/shutdown -r now30.3 11015 * * /root/sh/autobak.sh[rootlocalhost ~]# crontab -r#删除root用户所有的定时任务。如果只想删除某个定时任务则可以执行“crontab -e”命令进入#编辑模式手工删除[rootlocalhost ~]# crontab -lno crontab for root#删除后再查询就没有root用户的定时任务了在书写 crontab 定时任务时需要注意以下几个事项6 个选项都不能为空必须填写。如果不确定则使用“*”代表任意时间。crontab 定时任务的最小有效时间是分钟最大有效时间是月。像 2018 年某时执行、3 点 30 分 30 秒这样的时间都不能被识别。在定义时间时日期和星期最好不要在一条定时任务中出现因为它们都以天为单位非常容易让管理员混淆。在定时任务中不管是直接写命令还是在脚本中写命令最好都使用绝对路径。有时使用相对路径的命令会报错。