Linux定时任务
1.定时任务crond介绍
crond - 执行预定命令的守护进程,相当于定时任务的服务,在系统启动时便开启。
crond 只能执行最少分钟级别的定时任务,如果需要执行秒级别的需要自己写脚本,不过大多数情况下crond足够用了
2.定时任务的书写位置
使用man crond来查看crond使用,其中有下面的一段描述:
NAME
crond - 执行预定命令的守护进程
crond - daemon to execute scheduled commands
DESCRIPTION
...
// Cron将会检查这些文件和目录
Cron checks these files and directories:
/etc/crontab
// 翻译:系统定时任务。现在文件默认是空。最初,它通常用于运行每日、每周、每月的工作。
// 默认情况下,这些作业现在已经运行完了读取/etc/anacrontab配置文件。更多信息请参见anacrontab(5)。
system crontab. Nowadays the file is empty by default. Originally it was usually used to run daily, weekly, monthly jobs. By default these jobs are now run through
anacron which reads /etc/anacrontab configuration file. See anacrontab(5) for more details.
/etc/cron.d/
// 翻译:包含不同用户存储的系统cronjobs的目录。
directory that contains system cronjobs stored for different users.
/var/spool/cron
// 翻译:包含由crontab命令创建的用户crontables的目录。
directory that contains user crontables created by the crontab command.
从官方给出的描述可以看出:
crond将会扫描这些文件来执行定时任务:
1./etc/crontab文件
2./etc/cron.d/目录下的文件
3./var/spool/cron/$USER文件
/etc/crontab是系统级别的定时任务存放的文件,虽然也可以将自己的定时任务写在这个文件,但是最好不要那样做。
那/etc/cron.d/目录下的文件里的定时任务与/var/spool/cron/$USER文件里的定时任务有什么区别呢
区别1:
/etc/cron.d/目录下的文件里的定时任务--由三部分组成—cron user-name commond
/var/spool/cron/$USER文件里的定时任务 --由两部分组成—cron commond
区别2:
/etc/cron.d/目录下的文件里的定时任务--由命令区分该定时任务是由哪个用户执行的
/var/spool/cron/$USER文件里的定时任务 --由文件名区分该定时任务是由哪个用户执行的
一般定时任务写在/var/spool/cron/$USER文件里
3.crontab命令使用
假设我是root用户/或者任意一用户
每次查看定时任务都需要cat /var/spool/cron/root吗?
每次书写定时任务都需要vim /var/spool/cron/root吗?
NO,crond开发人员为我们想到了这个问题。因此便有了crontab工具。
man crontab可以看到:
crontab [-u user] [-l | -r | -e] [-i] [-s]
常用参数 -l 和 -e
第一次使用crontab -e命令将会在/var/spool/cron目录下创建一个对应用户名的文件。
crontab -l 命令等价于 cat /var/spool/cron/
U
S
E
R
,
查
看
/
v
a
r
/
s
p
o
o
l
/
c
r
o
n
/
USER,查看/var/spool/cron/
USER,查看/var/spool/cron/USER文件里的定时任务
crontab -e 命令等价于 vi /var/spool/cron/
U
S
E
R
,
编
辑
/
v
a
r
/
s
p
o
o
l
/
c
r
o
n
/
USER,编辑/var/spool/cron/
USER,编辑/var/spool/cron/USER文件里的定时任务
默认的是查看和编辑当前用户的,查看别的用户加上可选参数[-u user]
4.定时任务的书写格式
说完了定时任务的书写位置后,最后来说一下定时任务的书写格式:
使用cat /etc/crontab 先看一下注释介绍:
[root@VM_45_49_centos cron.d]# 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
SHELL 执行shell脚本的程序的路径
PATH 执行命令的PATH变量
MAILTO 邮件接收人
/etc/crontab文件里的定时任务书写格式:
cron user-name commond
/etc/cron.d/目录下的文件里的定时任务书写格式:
cron user-name commond
/var/spool/cron/$USER文件里的定时任务书写格式:
cron commond
书写规范;
1.每一个定时任务上方都应有注释、注明定时任务创建人、执行时间、以及该定时任务作用;
2.用定时任务执行脚本文件时候
应先自己执行一遍脚本,确保脚本能够正确执行;
应明确写出/bin/sh;
应明确指出脚本路径;
输出的信息可以存为文件也可以输出到空设备。
5.定时任务的案例
// 编写好一个脚本
[root@VM_45_49_centos ~]# cat /server/scripts/cron_printf_test.sh
#!bin/bash
datetime=$(date "+%Y-%m-%d %H:%M:%S")
echo $datetime >> /tmp/test.log
//编写定时任务
[root@VM_45_49_centos cron.d]# crontab -e
# edit by fengzi 每分钟执行一次脚本,将当前时间系统日期输出到/tmp/test.log
* * * * * /bin/sh /server/scripts/cron_printf_test.sh