Linux定时任务

定时任务简介

什么是定时任务

maintains crontab files for individual users 为单一用户维护crontab文件

为什么要使用定时任务

使用计划任务可以周期性的执行一些命令、脚本等,比如批量服务、备份脚本

Linux系统的定时任务分类

1、linux系统自身定期执行的任务工作:轮询系统日志、备份系统数据、清理系统缓存等,这些人物无需我们任务干预

此部分定时任务位置:

[root@localhost ~]# ll /etc/cron.d/
total 4
-rw-r--r--. 1 root root 128 Aug  3  2017 0hourly
[root@localhost ~]# cat /etc/cron.d/0hourly 
# Run the hourly jobs
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
01 * * * * root run-parts /etc/cron.hourly

2、用户自定义的定时任务 :如定时备份系统文件、数据库数据备份、同步系统时钟

定时任务的规范

1、定时任务的格式定义

# 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)               # 分钟,取值范围从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  # 每秒执行用户定义的命令

另外:

- :代表时间范围,如: 1-5 * * * * 表示每小时的前5分钟

* :代表任意时间、每(per)

,:代表时间点   如: * * * * 1,4,0 表示每周一、周四、周日

/num :表示时间间隔   如:*/5 * * * * 表示每隔5分钟执行

2、定时任务的示例

00 02 * * * ls      #每天的凌晨2点整执行
00 02 1 * * ls      #每月的1日的凌晨2点整执行
00 02 14 2 * ls     #每年的2月14日凌晨2点执行
00 02 * * 7 ls      #每周天的凌晨2点整执行
00 02 * 6 5 ls      #每年的6月周五凌晨2点执行
00 02 14 * 7 ls     #每月14日或每周日的凌晨2点都执行
00 02 14 2 7 ls     #每年的2月14日或每年2月的周天的凌晨2点执行   
*/10  02 * * * ls   #每天凌晨2点,每隔10分钟执行一次
* * * * *  ls       #每分钟都执行
00 00 14 2 *  ls    #每年2月14日的凌晨执行命令 
*/5 * * * *  ls     #每隔5分钟执行一次
00 02 * 1,5,8 * ls  #每年的1月5月8月凌晨2点执行
00 02 1-8 * *  ls    #每月1号到8号凌晨2点执行
0 21 * * * ls       #每天晚上21:00执行
45 4 1,10,22 * * ls #每月1、10、22日的4:45执行
45 4 1-10 * * l     #每月1到10日的4:45执行
3,15 8-11 */2 * * ls #每隔两天的上午8点到11点的第3和第15分钟执行
0 23-7/1 * * * ls   #晚上11点到早上7点之间,每隔一小时执行
15 21 * * 1-5 ls    #周一到周五每天晚上21:15执行

定时任务的配置文件位置

每个用户的定时任务位于:/var/spool/cron/USERNAME,当使用crontab -e选项时,就相当于编辑此文件

[root@localhost ~]# ll /var/spool/cron/
total 8
-rw------- 1 root root 35 Jun  5 00:42 root
-rw------- 1 root root 35 Jun  5 00:50 test

crond的全局配置文件

[root@localhost ~]# ll /etc/cron* -d
drwxr-xr-x. 2 root root  21 Dec 16  2018 /etc/cron.d
drwxr-xr-x. 2 root root  42 Dec 16  2018 /etc/cron.daily          # 每天执行一次的job
-rw-------. 1 root root   0 Aug  3  2017 /etc/cron.deny           # 限制用户使用crontab
drwxr-xr-x. 2 root root  22 Dec 16  2018 /etc/cron.hourly         # 每小时执行一次的job
drwxr-xr-x. 2 root root   6 Jun  9  2014 /etc/cron.monthly        # 每月执行一次的job
-rw-r--r--. 1 root root 451 Jun  9  2014 /etc/crontab
drwxr-xr-x. 2 root root   6 Jun  9  2014 /etc/cron.weekly         # 每周执行一次的job

crontab命令的使用

1、crontab命令的语法

crontab [-u user] file
crontab [-u user] [-l | -r | -e] [-i] [-s]
crontab -n [ hostname ]
crontab -c

2、常用选项

选项 描述
-e 编辑、修改当前用户的定时任务
-l 查看当前用户的定时任务
-r 删除当前用户的定时任务
-i 与-r合用,删除之前交互式提示
-u 指定用户

3、设置定时任务

检查服务是否启动,如果未启动需要安装

[root@localhost ~]# ps -ef|grep cron|grep -v grep
root        508      1  0 Jun04 ?        00:00:00 /usr/sbin/crond -n
  • 使用-e选项设置
# crontab -e
* * * * *  /usr/bin/echo 1 >> /root/a.txt
  • 从已有文件进行设置(如果之前设置过定时任务,会覆盖)
# vim echo_cron
* * * * *  /usr/bin/echo 1 >>c.txt

# crontab echo_cron

# crontab -l
* * * * *  /usr/bin/echo 1 >>c.txt
  • 为指定用户设置定时任务(默认设置的是当前用户)
[root@localhost ~]# useradd test

[root@localhost ~]# crontab -e -u test
* * * * *  /usr/bin/echo 1 >>c.txt

或者
[root@localhost ~]# crontab -u test echo_cron

4、设置某用户无法使用crontab

# echo "test" >> /etc/cron.deny 

[root@localhost ~]# su - test
Last login: Sat Jun  5 00:51:10 EDT 2021 on pts/0

[test@localhost ~]$ crontab -e
You (test) are not allowed to use this program (crontab)
See crontab(1) for more information

[test@localhost ~]$ crontab -l
You (test) are not allowed to use this program (crontab)
See crontab(1) for more information

注意,此功能是限制该用户无法使用crontab命令进行设置,有使用-u权限的用户仍可以为该用户设置定时任务

# crontab -e -u test
* * * * *  /usr/bin/echo 1 >>c.txt
* * * * *  /usr/bin/echo 22 >>d.txt

[root@localhost ~]# ll /home/test/
total 8
-rw-r--r-- 1 test test 44 Jun  5 01:12 c.txt
-rw-r--r-- 1 test test  3 Jun  5 01:12 d.txt

5、备份crontab

1、备份/var/spool/cron/{username}

2、通过/var/log/cron中的记录,推算任务执行时间(亲身经历某银行-r选项被开发使用,导致跑批定时任务清空,而且没有备份,只能分析文件)

使用crond的注意事项

1、定时任务规则之前加注释

2、定时任务脚本中的程序命令及路径尽量用绝对路径

3、使用命令执行定时任务时,一定要用命令的绝对路径,最好使用脚本代替命令行定时任务

4、运行脚本一定要用/bin/sh

5、定时任务中命令或脚本的结果(正确和错误的)重定向到/dev/null或追加到文件中,如果没有定向到文件或者定向到黑洞中(/dev/null)时间久了就会出现NO SPACE of device那个错误 inode满了

6、时间变量问题用反斜线

7、注意有些命令是无法成功执行的 echo "123" >>/tmp/test.log &>/dev/null

crond的使用常见问题

1、定时任务的输出结果没有定向到空或文件,没有开邮件服务导致产生大量小文件,系统inode被占满

解决办法:

删除/var/spool/postfix/maildrop/下的小文件

如果定时任务结果没重定向到文件或者/dev/null,而开启了右键服务,会给root用户发邮件

2、时间变量的反斜线问题

“%”在crontab任务配置中被认为是newline,需要用“\”来转义。crontab任务命令中,如果有date +%F-%T 必须替换为:date +\%F-\%T,是写在脚本中就不需要转义了。

 

上一篇:记一次部署Hadoop后遭受kthreaddi挖矿病毒


下一篇:记一次crontab执行失败