https://blog.csdn.net/zengxianglei/article/details/91601010
ntpd 和ntpdate的区别 以及系统时间 硬件时间 及时间同步 crontab –e
一 crontab 周期性任务被执行指令
1.首先crontab 命令 介绍
安装链接:https://blog.csdn.net/xiangxianghehe/article/details/78149094
1.crontab命令常见于Unix和Linux的操作系统之中,用于设置周期性被执行的指令
2.该命令从标准输入设备读取指令,并将其存放于"crontab"文件中,以供之后读取和执行。
在Linux系统中,Linux任务调度的工作主要分为以下两类:
1、系统执行的工作:系统周期性所要执行的工作,如备份系统数据、清理缓存
2、个人执行的工作:某个用户定期要做的工作,例如每隔10分钟检查邮件服务器是否有新信,这些工作可由每个用户自行设置
一、/etc/crontab、/etc/cron.deny 、 /etc/cron.allow文件介绍
系统调度的任务,一般存放在/etc/crontab这个文件下,里面存放了一些系统运行的调度程序,cat /etc/crontab 查看内容:
这些任务都会是系统在运行起来后自动进行调度的。同时在/etc目录下还存放了/etc/cron.deny 和 /etc/cron.allow 文件【我的有 cron.deny 文件但是没有内容,没有cron.allow文件】
/etc/cron.deny 表示不能使用crontab 命令的用户
/etc/cron.allow 表示能使用crontab的用户。
如果两个文件同时存在,那么/etc/cron.allow 优先。
如果两个文件都不存在,那么只有root用户可以安排作业。
二、.crontab命令语法及其各个参数含义
crontab命令的语法为:
crontab [-e [UserName]|-l [UserName]|-r [UserName]|-v [UserName]|File ]
1
注意:crontab 是用来让使用者在固定时间或固定间隔执行程序之用,换句话说,也就是类似使用者的时程表。-u user 是指设定指定 user 的时程表,这个前提是你必须要有其权限(比如说是 root)才能够指定他人的时程表。如果不使用 -u user 的话,就是表示设定自己的时程表。
各个参数说明:
-e [UserName]: 执行文字编辑器来设定时程表,内定的文字编辑器是 vi
-r [UserName]: 删除目前的时程表
-l [UserName]: 列出目前的时程表
-v [UserName]:列出用户cron作业的状态
【一般 执行crontab -e 即可编辑自己的周期性要执行的任务 】
三、crontab命令的格式
我们如果要创建自己的一个任务调度,可以使用 crontab -e 这个命令,如:
此时会进入到vi编辑界面,来编写我们要调度的任务,crontab调度命令的格式如下:
-
-
-
-
- command path // 前五个字段可以取整数值,指定何时开始工作,第六个域是字符串,即命令字段,其中包括了crontab调度执行的命令。 各个字段之间用spaces和tabs分割。【分 时 日 月 周 要执行的命令 +路径】
-
-
-
crontab命令中的一些常用特殊符号:【*:任意时刻; ,表示分割(类似于枚举);-:表示一个段,如小时处 1-5 ,表示1-5点;/n :每隔n时间执行一次】
举例:【以下只是设置 执行周期 并没有写具体执行什么命令 即:没写 command path】
43 21 * * * 每天的21:43 执行
15 05 * * * 每天的05:15 执行
0 17 * * * 每天的17:00 执行
0 17 * * 1 每周一的 17:00 执行
0,10 17 * * 0,2,3 每周日,周二,周三的 17:00和 17:10 执行
0-10 17 1 * * 毎月1日从 17:00到7:10 毎隔1分钟 执行
0 0 1,15 * 1 毎月1日和 15日和 一日的 0:00 执行
42 4 1 * * 毎月1日的 4:42分 执行
0 21 * * 1-6 周一到周六 21:00 执行
0,10,20,30,40,50 * * * * 每隔10分 执行
*/10 * * * * 每隔10分 执行
- 1 * * * 从1:0到1:59 每隔1分钟 执行
0 1 * * * 1:00 执行
0 */1 * * * 毎时0分 每隔1小时 执行
0 * * * * 毎时0分 每隔1小时 执行
2 8-20/3 * * * 8:02,11:02,14:02,17:02,20:02 执行
30 5 1,15 * * 1日 和 15日的 5:30 执行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
四、创建我们自己的crontab命令 【尝试自己的命令】
案例一:
/2 * * * * date >> /root/shijian.txt【就是每2分钟 向 shijian.txt 文件中写入 系统时间】
前面五个/2 * * * *表示时间是每隔2分钟 date命令就是得到当前的系统时间, >> 命令表示将结果累加到文件后面 > 命令则表示将结果覆盖文件 )
1
2
保存以后如果出现 crontab: installing new crontab 这句话,则表示该调度命令已经成功
疑问1:怎样查看crontab 启动的 任务?
crontab -l
疑问2:使用crontab -e 产生的编辑文件在哪里?
链接:http://www.mamicode.com/info-detail-2221870.html
在这个路径下:/var/spool/cron目录下,具体的用户名文件中
看下效果:
疑问3:crontab 周期 分 时 日 月 周 哪如何具体到秒 如 3秒 执行一次?
首先 */1 等价于 * ,如
*/1 * * * * /home/somedir/scripts.sh 【每分钟执行一次 scripts.sh 脚本一次】
*/1 * * * * sleep 3 && /home/somedir/scripts.sh 【每隔3秒 执行一次】
疑问4 :既然启动了定时任务,哪什么时候终止 ?怎样终止?
/sbin/service crond start //启动服务
/sbin/service crond stop //关闭服务
/sbin/service crond restart //重启服务
/sbin/service crond reload //重新载入配置
查看crontab服务状态:
service crond status
手动启动crontab服务:
service crond start
查看crontab服务是否已设置为开机启动,执行命令:
ntsysv
加入开机自动启动:
chkconfig –level 35 crond on
开机启动方法二:要把cron设为在开机的时候自动启动,在 /etc/rc.d/rc.local 脚本中加入 /sbin/service crond start 即可。
疑问5 :如何删除?
链接:https://www.cnblogs.com/kenshinobiy/p/7685229.html
crontab -r
chkconfig –level 35 crond on
上面的案例一:是通过crontab -e 其实我们还可以通过另一种方式 :vi /etc/corntab 直接编辑这个文件如: 每天早上5点定时重启系统:0 5 * * * root reboot,编辑完成后 需要执行
crontab /etc/crontab 【加载任务,使之生效】
同时上面的案例一 有缺陷:因为如果命令一多的话,并且如果我需要不同用户执行不同的命令时,这种方法在维护起来不方便,所以这里介绍另外一种方法。
优化案例二:首先编写一个可执行的sh文件,然后将我们要执行的任务写着sh文件里面,最后通过crontab来执行我们的sh文件即可(推荐)
vi task.sh
内容:
date >> /home/date1.txt
cp /home/date1.txt /date3.txt
2.此时我们的task.sh还不是可执行文件,通过ls -l命令我们可以看到
3.chmod 744 task.sh
4.然后我们输入crontab -e 命令,将之前的命令删除掉,或者在前面加 # 号注释掉:
#* * * * * date >> /root/shijian.txt
-
-
-
-
- /task.sh
1
2
5.这时我们发现根目录下面已经存在了date3.txt文件了,成功结束。
- /task.sh
-
-
-
二 linux 系统时间和硬件时间
系统时间:(System Clock)。【date 命令 查看】
硬件时间:Real Time Clock,简称RTC。【hwclock -r 命令查看】
在同步时间前需要先检查时区是否是china的CTS时区
必须确保时区准确,否则时间同步后显示不正常
如:正常
如:不正常
疑问:如果时间不一致怎么办? 【自己的情况:每台机器上 的 date 和hwclock-r 时间是一样的,但是 最开始我将 三台 机器 note1 note2 note3 用date -s "时间戳"将三台机器时间设置成了一样 工作几个月后 note2 note3 机器时间一样 但主机note1与其他倆台机器不一致】
怀疑:可能是当时 主机note1上采用了cst时区,但是note2 和note3没有设置cst时区造成的。
如何设置采用cst时区?
解决链接:https://www.jianshu.com/p/304dedfef15d
tzselect
输入 Asia 序号
3.输入 China 序号
4.输入 China beijing shanghai 序号
5.确定
6.最后一步:
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
7.将硬件时间同步系统的时间
hwclock --hctosys 【如果不成功,重启下即可】
如图:
结束成功 !【】
下面是具体 介绍:系统时间 和硬件时间
Windows时钟大家可能十分熟悉了,Linux时钟在概念上类似Windows时钟显示当前系统时间,但在时钟分类和设置上却和Windows大相径庭。和Windows不同的是,Linux将时钟分为系统时钟(System Clock)和硬件(Real Time Clock,简称RTC)时钟两种。系统时间是指当前Linux Kernel中的时钟,而硬件时钟则是主板上由电池供电的那个主板硬件时钟,这个时钟可以在BIOS的"Standard BIOS Feture"项中进行设置。
既然Linux有两个时钟系统,那么大家所使用的Linux默认使用哪种时钟系统呢?会不回出现两种系统时钟冲突的情况呢?这些疑问和担心不无道理。首先,Linux并没有默认哪个时钟系统。当Linux启动时,硬件时钟会去读取系统时钟的设置,然后系统时钟就会独立于硬件运作。
从Linux启动过程来看,系统时钟和硬件时钟不会发生冲突,但Linux中的所有命令(包括函数)都是采用的系统时钟设置。不仅如此,系统时钟和硬件时钟还可以采用异步方式,即系统时间和硬件时间可以不同。这样做的好处对于普通用户意义不大,但对于Linux网络管理员却有很大的用处。例如,要将一个很大的网络中(跨越若干时区)的服务器同步,假如位于美国纽约的Linux服务器和北京的Linux服务器,其中一台服务器无须改变硬件时钟而只需临时设置一个系统时间,如要将北京服务器上的时间设置为纽约时间,两台服务器完成文件的同步后,再与原来的时钟同步一下即可。这样系统和硬件时钟就提供了更为灵活的操作。
在Linux中,用于时钟查看和设置的命令主要有date、hwclock和clock。其中,clock和hwclock用法相近,只不过clock命 令除了支持x86硬件体系外,还支持Alpha硬件体系。由于目前绝大多数用户使用x86硬件体系,所以可以视这两个命令为一个命令来学习。
1.在虚拟终端中使用date命令来查看和设置系统时间
查看系统时钟的操作:
date
设置系统时钟的操作:
date -s “时间戳”
通用的设置格式:
date 月日时分年.秒
2.使用hwclock或clock命令查看和设置硬件时钟
查看硬件时钟的操作:
**# hwclock --show 或 hwclock -r
clock --show**
2003年09月17日 星期三 13时24分11秒 -0.482735 seconds
设置硬件时钟的操作:
hwclock --set --date=“09/17/2003 13:26:00”
或者
clock --set --date=“09/17/2003 13:26:00”
通用的设置格式:hwclock/clock --set --date=“月/日/年时:分:秒”。
3.同步系统时钟和硬件时钟
Linux系统(笔者使用的是Red Hat 8.0,其它系统没有做过实验)默认重启后,硬件时钟和系统时钟同步。如果不大方便重新启动的话(服务器通常很少重启),使用clock或hwclock命令来同步系统时钟和硬件时钟。
硬件时钟与系统时钟同步(系统同步硬件的):
hwclock --hctosys
或者
clock --hctosys
上面命令中,–hctosys表示Hardware Clock to SYStem clock。
系统时钟和硬件时钟同步(硬件同步系统的):
hwclock --systohc
或者
clock --systohc
三 ntpd 和ntpdate 的用法及区别
前言: 因为,ntpdate同步时间,会造成时间的跳跃,对一些依赖时间的程序和服务会造成影响。比如sleep,timer等。而且,ntpd服务可以在修正时间的同时,修正cpu tick。理想的做法为,在开机的时候,使用ntpdate强制同步时间,在其他时候使用ntpd服务来同步时间。
首先 ntp服务器是一个时间同步服务器。
在Windwos中,系统时间的设置很简单,界面操作,通俗易懂。而且设置后,重启,关机都没关系。系统时间会自动保存在Bios的时钟里面,启动计算机的时候,系统会自动在Bios里面取硬件时间,以保证时间的不间断。
但在Linux下,默认情况下,系统时间和硬件时间,并不会自动同步。在Linux运行过程中,系统时间和硬件时间以异步的方式运行,互不干扰。硬件时间的运行,是靠Bios电池来维持,而系统时间,是用CPU tick来维持的。在系统开机的时候,会自动从Bios中取得硬件时间,设置为系统时间。
1.设置系统时间 date -s " " 或者 date -set " " ;查看系统时间 :date
2.设置硬件时间 hwclock --set–date="" ;查看硬件时间 :hwclock -r
3.clock与hwclock 的区别:clock 不仅支持X86硬件系统 还支持 alpha硬件系统。
不同机器之间的时间同步(重点)
为了避免主机时间因为长期运作下所导致的时间偏差,进行时间同步(synchronize)的工作是非常必要的。Linux系统下,一般使用ntp服务器来同步不同机器的时间。一台机器,可以同时是ntp服务器和ntp客户机。在网络中,推荐使用像DNS服务器一样分层的时间服务器来同步时间。
同步时间,可以使用ntpdate命令,也可以使用ntpd服务(debian中ntp服务器为ntp服务,需要安装apt-get install ntp,同时对上手动同步时间需要用到ntpdate,故还需安装apt-get install ntpdate)。
案例1 ntpdate +cron (不建议使用)
使用ntpdate比较简单。格式如下:
1
[root@linux ~]# ntpdate [-nv] [NTP IP/hostname]
[root@linux ~]# ntpdate 192.168.0.2
[root@linux ~]# ntpdate time.ntp.org
但这样的同步,只是强制性的将系统时间设置为ntp服务器时间。如果cpu tick有问题,只是治标不治本。所以,一般配合cron命令,来进行定期同步设置。比如,在crontab中添加:
0 12 * * * * /usr/sbin/ntpdate 192.168.0.1
这样,会在每天的12点整,同步一次时间。ntp服务器为192.168.0.1。
因为,ntpdate同步时间,会造成时间的跳跃,对一些依赖时间的程序和服务会造成影响。比如sleep,timer等。而且,ntpd服务可以在修正时间的同时,修正cpu tick。理想的做法为,在开机的时候,使用ntpdate强制同步时间,在其他时候使用ntpd服务来同步时间。
所以引出案例二:使用ntpd
学习链接:https://www.cnblogs.com/liushui-sky/p/9203657.html
这个总结的更好:https://www.cnblogs.com/kerrycode/archive/2015/08/20/4744804.html
————————————————
版权声明:本文为CSDN博主「zengxianglei」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zengxianglei/article/details/91601010