Linux计划任务管理
crond计划任务概述
什么是计划任务,计划任务类似于我们平时生活中的闹钟。
在Linux
系统的计划任务服务crond
可以满足周期性执行任务的需求。
crond
进程每分钟会处理一次计划任务,计划任务主要是做一些周期性的任务目前最主要的用途是定时备份数据
- 计划任务的服务进程crond(
默认开启,但如果要使用计划任务应该查看状态
)
[root@system_rookie ~]# systemctl status crond.service
● crond.service - Command Scheduler
Loaded: loaded (/usr/lib/systemd/system/crond.service; enab>
Active: active (running) since Wed 2020-08-19 22:36:17 EDT;>
Main PID: 1049 (crond)
CGroup: /system.slice/crond.service
└─1049 /usr/sbin/crond -n
8月 20 04:01:01 system_rookie anacron[2687]: Jobs will be exec>
lines 1-8
-
计划任务分为以下两种情况:
- 系统级别的定时任务:
- 清理系统缓存
- 临时文件清理
- 系统信息采集
- 日志文件切割 - 用户级别的定时任务:
- 定时同步互联网时间
- 定时备份系统配置文件
- 定时备份数据库文件
- 系统级别的定时任务:
-
计划任务配置文件
/etc/crontab
[root@localhost ~]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
crond配置文件详解
文件 | 说明 |
---|---|
/etc/crontab | crontab配置文件 |
/etc/cron.deny | 该文件中所列用户不允许使用crontab命令(黑名单) |
/var/spool/cron/* | 所有用户定时文件都存放此目录,文件以用户名命名 |
/var/log/cron | 定时任务执行后的日志文件,可用来回溯 |
- 利用
/var/log/cron
,恢复删除的计划任务
通过查看/var/log/cron
日志文件,找出计划任务的执行规律;推测出时间规划周期,从而恢复之前删除的计划任务 - 查看用户建立的计划任务
[wcl@localhost root]$ crontab -l
no crontab for wcl
- 将普通用户加入黑名单
/etc/cron.deny
(root用户不受限制)
默认情况下没有该文件,需要手动创建
[root@localhost ~]# cat /etc/cron.deny
wcl
[root@localhost ~]# su wcl
[wcl@localhost root]$ cron
crond cronnext crontab
[wcl@localhost root]$ crontab -l
You (wcl) are not allowed to use this program (crontab)
See crontab(1) for more information
- 将用户加入白名单
/etc/cron.allow
(白名单默认情况下没有需要自己创建)
默认情况下没有该文件,需要手动创建
[root@localhost ~]# cat /etc/cron.deny
[root@localhost ~]# cat /etc/cron.allow
wcl
[root@localhost ~]# su wei
[wei@localhost root]$ crontab -l
You (wei) are not allowed to use this program (crontab)
See crontab(1) for more information
编辑计划任务crontab -e
[root@localhost ~]# crontab -e
no crontab for root - using an empty one
crontab: installing new crontab
[root@localhost ~]# crontab -l
10 11 * * * /bin/echo "baby"
#编辑计划任务后/var/spool/cron下会出现对应用户的文件
[root@localhost ~]# cat /var/spool/cron/root
10 11 * * * /bin/echo "baby"
- 查看其他用户创建计划任务(仅限Root用户使用)
[root@localhost ~]# crontab -u wei -l
no crontab for wei
- 删除所有的计划任务("
禁止使用
")
[root@localhost ~]# crontab -r
[root@localhost ~]# crontab -l
no crontab for root
需要删除计划任务时应该使用crontab -e
进入到编辑界面一条条地删除
crond编写示例
00 02 * * * command
00 02 1 * * command
00 02 14 2 * command
00 02 * * 7 command
00 02 * 6 5 command
00 02 14 * 7 command
00 02 14 2 7 command
00 02 * * * command
* 02 * * * command
* * * * * command
* * 14 2 * command
*/5* * * * command
00 02 *1,5,8 * command
00 02 1-8 * * command
crond书写规范
- 给计划任务写注释
[root@system_rookie ~]# crontab -l
## cront of root
00 13 22 8 * /usr/bin/echo "I'm on the frount of line"
- 规范机会任务执行脚本存放路径/scripts
[root@system_rookie ~]# crontab -l
## How many IP connect the localhost
*/10 13 22 08 * /usr/bin/bash /scripts/ipssh.sh &>/dev/null
- 执行shell脚本前加/bin/sh,脚本结尾加
&> /dev/null
调试好后应屏蔽debug信息避免系统垃圾过多占用inode;如需输出日志,可重定向至文件
crond配置实例
[root@wangqing ~]# crontab -e
#每天凌晨切割nginx日志
05 00***/bin/bash -x /scripts/cut_nginx.sh &> /scripts/log/nginx.log
#每天5点备份数据库
00 05*** /bin/bash -x /scripts/dump_sql.sh &>/scripts/log/mysql.log
#注意:
#1.我们所有的crond服务是运行的程序。而crontab命令用户用来设置定时规则的命令。
#2.crond服务是企业生产工作中常用的重要服务,at很少使用,可以忽略。
#3.几乎每个服务器都会用到crond服务。
志文件中即可。
- crond计划任务调试
- 调整任务每分钟执行,检测是否是否正常,有些任务不要频繁执行
- 调整系统时间然后在检测任务,生产不建议直接使用此方式
- 执行脚本,将脚本执行输出写入指定日志文件,观察日志内容是否正常
- 注意一些任务命令带来的问题echo “wangqing” >>/tmp/test.log &>/dev/null
- 命令使用绝对路径,防止无法找到命令导致定时任务执行故障
- 查看/var/log/cron日志进行调试
建议:将需要定期执行的任务写入脚本中,建立/scripts目录统一存放脚本,脚本中命令必须使用绝对路径,
手动执行脚本检测输出是否正常,然后将脚本加入计划任务测试,测试后无问题将脚本输出写入对应的日
志文件中即可。
计划任务添加步骤:
- 手动执行保留执行命令的正确结果
- 编写脚本
- 脚本需要统一路径/scripts
- 脚本开头建议填写注释信息,包括执行时间、周期、任务
- 脚本内容复制执行成功的命令至脚本文件中(减少每个环节出错几率)
- 脚本内容尽可能的优化,使用一些变量或使用简单的判断语句
- 脚本执行的输出信息不要随意打印,可以重定向至其他位置保留或丢入黑洞
- 执行脚本
- 使用bash执行,防止脚本没有增加执行权限(/bin/bash)
- 执行命令以及脚本成功后并复制该命令
- 编写计划任务
- 加上必要的注释信息,人、时间、任务
- 设定计划任务执行的周期
- 加入执行脚本的命令
- 调试计划任务
- 增加任务频率测试、调整系统时间测试(不能用于生产)
- 检查环境变量问题、检查crond服务产生日志进行排查