Linux-定时任务

前言

定时任务有什么用?
计划任务主要是做一些周期性的任务,比如凌晨3点定时备份数据、晚上23点开启网站抢购接口、凌晨0点关闭抢占接口等。

计划任务主要分为以下两种使用情况:

1.系统级别的定时任务

临时文件清理、系统信息采集、日志文件切割

2.用户级别的定时任务

定时向互联网同步时间、定时备份系统配置文件、定时备份数据库的数据。

正文

定时任务软件种类

  1. 定时任务软件:cronie
    默认系统自带定时服务 crond(crontab)
  2. 定时任务软件:atd
    定时任务只执行一次,一次性定时服务
  3. 定时任务软件:anacron
    主要用于非7*24小时运行的服务器

定时任务配置方式

系统已经存在的定时任务
  1. 系统定时任务周期:每小时
    控制定时任务目录:/etc/cron.hourly
  2. 系统定时任务周期:每一天
    控制定时任务目录:/etc/cron.daily
  3. 系统定时任务周期:每一周
    控制定时任务目录:/etc/cron.weekly
  4. 系统定时任务周期:每个月
    控制定时任务目录:/etc/cron.monthly

如何设置系统定时任务?

在上面四个目录中,创建脚本文件即可

cd  /etc/cron.hourly/
echo "echo jjj" > test.sh

相关文件

/var/log/cron :用来记录crontab这个服务的内容;
/var/log/messages :几乎所有的开机系统发生的错误都会在此记录;
/var/log/secure :记录登录系统存取数据的文件;

PS:系统默认定时任务没有1小时以下间隔时间

用户自定义定时任务

查看用户设置的定时任务

# 用命令查看
[root@cql ~]# crontab -l
no crontab for root
# 伪装成oldgirl身份查看oldgirl用户的定时任务信息
[root@cql ~]# crontab -u oldgirl -l
no crontab for oldgirl 

# 利用文件查看
# 查看root用户编辑的定时任务信息
crontab -l  == cat /var/spool/cron/root  

如何配置定时任务?

# root用户定义的定时任务
crontab -e  == vim /var/spool/cron/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

*	 *	  *	    *	*	command
分	时	  日	月	周

分 0-59
时 0-23
日 0-31
月 1-12
周 0-6

# 每天凌晨2点执行ls命令
0 2 * * * ls

# 每个月1号执行凌晨两点执行ls
0 2 1 * *  ls

# 每月1号和15号12点都执行一次ls命令
0 12 1,15 * * ls

# 每月1号到15号12点都执行一次ls命令
0 12 1-15 * * ls

# 每年的2月14日凌晨2点,执行ls命令
0 2 14 2 * ls

# 每周日凌晨2点执行ls命令
0 2 * * 7 ls

#  每年6月份周五凌晨2点执行ls命令
0 2 * 6 5 ls

# 每个月的14号并且是周日,凌晨两点执行ls
0 2 14 * 7 

# 满足每年的2月14日时候是周日的时候执行ls
0 2 14 2 7 ls

# 在每天凌晨2点这个时段,每10分钟执行一次,在2:00这个时刻会执行。
*/10 2 * * * ls

# 没分钟执行一次ls
* * * * * ls
*/1 * * * * ls

# 每年2月14日凌晨00点,执行ls
0 0 14 2 * ls

# 每5min执行一次,至保存的时候开始
*/5 * * * * ls

# 每年的1月和5月和8月每天晚上凌晨2点执行ls
00 2 1,5,8 * ls

# 在每年1到7月和9-12月的每天凌晨2点执行ls
00 02 1-7,9-12 * ls

# 每个月的1-8号执行,凌晨2点执行ls
00 02 1-8 * * 

# 每个月的1号和10号和22号的凌晨4点45分执行ls命令   
45 04 1,10,22 * * ls

# 每个月的每2天的8点到11点的3分和15分执行ls命令   ---------跨月的时候
3,15 8-11 */2 * * /bin/ls
保存时间:2020年4月26日 11点35分

4月28号,8点03分 和 8点15分,9点03分 和9点15分 , 10点03分和10点15分,11点03分和11点15分执行ls命令
4月30号
5月1号
5月3号

# 每天的00点-7点的每个小时和23点-00点的每个小时都执行ls命令
0 23-7/1 * * * /bin/ls

# 每周一到周五的晚上21点15分执行ls命令
15 21 * * 1-5 /bin/ls

定时任务编写的注意事项
1). 在定时任务执行的时候, 无法识别定时任务命令中的特殊字符
2). 在定时任务中, 操作文件要写好绝对路径信息
3). 在定时任务中, 识别的$PATH环境变量信息只有 /usr/bin:/bin
a 有些系统的特殊命令需要以绝对路径进行执行
b (慎用) 可以在定时任务配置文件开始定义新的PATH环境变量信息
4). 在执行定时任务时, 最好在所有任务命令后面加上 &>/dev/null 或 >/dev/null 2>&1
原因:执行定时任务会输出很多信息,会导致我们的磁盘空间减少,所以将输出信息输送到黑洞中(/dev/null)
5)如何在一个时间有多条指令需要执行,可以编写一个脚本文件,然后定时任务就是执行这个脚本文件。建议路径写据对路径。因为如果是相对路径,那么是相对这个定时任务配置文件的。
cat /var/spool/cron/root
/bin/sh shell.sh

如何查看确认定时任务已经执行过了?

tail -f /var/log/cron
Jan 26 17:07:01 oldboy-xiaodao CROND[2184]: (oldgirl)    CMD    (echo oldgirl_info >>/tmp/oldgirl_cron.txt )
Jan 26 17:08:01 oldboy-xiaodao CROND[2196]: (oldgirl)    CMD    (echo oldgirl_info >>/tmp/oldgirl_cron.txt )
Jan 26 17:09:01 oldboy-xiaodao crond[735]:  (root)       RELOAD (/var/spool/cron/root)
Jan 26 17:09:01 oldboy-xiaodao CROND[2203]: (oldgirl)    CMD    (echo oldgirl_info >>/tmp/oldgirl_cron.txt )
Jan 26 17:09:01 oldboy-xiaodao CROND[2204]: (root)       CMD    (cp /etc/hosts /tmp/hosts_bak_$(date +)
Jan 26 17:10:01 oldboy-xiaodao CROND[2224]: (root)       CMD    (cp /etc/hosts /tmp/hosts_bak_$(date +)
Jan 26 17:10:01 oldboy-xiaodao CROND[2225]: (oldgirl)    CMD    (echo oldgirl_info >>/tmp/oldgirl_cron.txt )
 01               02                         03            			04 

01: 定时任务执行的时间
02: 执行定时任务的主机名称
03: 执行哪个用户定义定时任务	
04: 执行定时任务的命令信息

centos 系统禁止普通用户使用crontab命令

cron计划任务默认root用户与非root用户都可以执行,当然如果在安全方面想禁用这部分用户,则可以通过两个文件来解决:

  • /etc/cron.allow
  • /etc/cron.deny

cron.allow:定义允许使用crontab命令的用户
cron.deny:定义拒绝使用crontab命令的用户

这两个文件有优先级,普通用户在执行crontab命令的时候
1、系统先检测cron.allow文件是否存在;如果存在,则检测文件中存在的用户中是否有当前用户,检测通过则开始执行,检测不通过直接提示该用户没有执行权限

2、当系统没有检测到cron.allow文件存在的时候,则接下来检测cron.deny文件,看当前用户是否被deny掉,如果没有在cron.deny文件中检测到当前运行crontab的用户,则该命令可以成功执行,如果有检测到该用户在cron.deny文件中,则直接提示该用户没有执行权限

案例1:只允许root和www用户执行crontab命令,其他用户则禁止执行
在需要定义该策略的主机上面执行:
echo “www” > /etc/cron.allow

案例2:只拒绝anonymous用户执行crontab命令,其他用户都可以执行该命令:
rm -f /etc/cron.allow
echo “anonymous” > /etc/cron.deny

定时任务编写案例

  1. 定时重启系统服务,每天23到第二天7点每隔1小时重启nginx服务
1.测试定时执行命令
/application/sbin/nginx -s reload

2.编写定时任务信息
crontab -e
2.1 编写注释信息
# reboot nginx server
2.2 编写定时任务
00 23,00-07/1 * * *  /application/sbin/nginx -s reload

3.检查定时任务效果
查看定时任务日志	tail -f /var/log/cron
查看定时任务效果	tail -f /oldboy/oldboy.txt

4.排查定时任务问题
注意事项:
表示整点17点18点19点  00 17-19 * * * cmd
表示半夜12点 00 00 * * * cmd

定时任务的9句劝告

①. 定时任务规则之前加注释
表示定时任务在干什么
②. 使用脚本替代命令执行定时任务

  • 超过两条命,就用脚本
  • 脚本相当于命令的合集

③. 定时任务中date命令%百分号

          • date +%F%T >>/oldboy/time.txt 2>&1 (用 \ 转移)

④. 运行脚本一定要用/bin/sh /bin/bash
因为默认脚本没有执行权限

⑤. 定时任务中-命令或脚本结果(正确及错误)定向到黑洞(>/dev/null 2>&1)或追加到文件中 >>/tmp/oldboy.txt 2>&1

⑥. 避免不必要的程序及命令输出

⑦. 打包压缩使用相对路径(切到目标目录的上一级打包目标)

⑧. 定时任务脚本中的程序文件 ,尽量用绝对路径

⑨. 系统与命令位置有关的环境变量问题
$PATH = /usr/bin:/bin

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值