关于 cron crontab crond 计划任务

关于 cron crontab crond 计划任务
2018/12/06 Chenxin
过去一直在使用linux cron,期间也遇到过一些问题.现对一些注意点进行归结一下.

工作原理
计划任务(jobs)会被放置在 /var/spool/cron/ 目录下,以用户名来命名的一个文件.
crond 检测的时间周期是 "分钟", 每分钟会读取一次 /etc/crontab(系统级的计划任务), 以及 /var/spool/cron/(用户级的计划任务)里面的记录并执行.
crond 执行的每一项任务,都会被记录到 /var/log/cron.
注意: /var/log/cron文件.执行失败并不会记录报错,报错条目会记录到/var/log/maillog,报错具体内容则需要开启对应的邮件服务,才会记录到具体的邮件内容里.(最好还是不开,防止磁盘写满)

区分 crontab -e 与 /etc/crontab
crontab -e用户级的例行性任务(一般是root).
/etc/crontab是系统级的例行性任务(一般不用).

cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin # 注意这里的PATH变量
MAILTO=root

* * * * * user-name command to be executed

执行失败的原因
手动执行脚本成功,而放到cron里却无法正确执行.
用户在SSH登录的时候,bash 读取多个配置文件(/etc/profile, ~/.bash_profile, ~/.bashrc ...),从而为我们设定了很多环境变量.
而cron则并没有获取用户的PATH变量的能力.账号级别的cron对应的PATH是:
/usr/bin:/bin
比如在用户级别的cron里,调用ntpdate us.ntp.org.cn 是无法正常执行的.正确的方式是/usr/sbin/ntpdate us.ntp.org.cn .因为默认PATH里没有这个路径.
当然,也可以在cron里,脚本执行前,先 source /etc/profile 一下(或 ". /etc/profile",这里的"点"同source).
而系统级的cron则不同,具体参考/etc/crontab文件内容.

日志说明
/var/log/cron 所有cron执行的记录(执行失败也会记录,且不区分执行是否成功)
/var/log/maillog 在cron执行失败的时候,会有一个邮件发送的动作,这个动作记录在这里(即使没有开启邮件服务).如果同时邮件服务正常,则发给root用户,且能看到具体执行报错内容.

其他用途
cron方式的开机自动启动
注意@reboot xxx-command, 所有写 rc.local 的东西, 也可以使用 @reboot 写在 crontab 里面.用这个方式为服务器开机自启对应的程序.
语法如下
@reboot Run once, at startup. #这个可以用于reboot后,自动运行一次
@yearly Run once a year, "0 0 1 1 *"每年一次,同 @annually (same as @yearly)
@monthly Run once a month, "0 0 1 * *"每月
@weekly Run once a week, "0 0 * * 0" 每周
@daily Run once a day, "0 0 * * *"每天一次,同 @midnight (same as @daily)
@hourly Run once an hour, "0 * * * *"每小时.如@hourly /usr/local/awstats.sh #使用@hourly对应的是 0 * * * * 每个小时运行一次

修改cron文件示例
sed -i 's/01\ *\ *\ *\ *\ *ntpdate\ us.ntp.org.cn/01\ *\ *\ *\ *\ /usr/sbin/ntpdate\ us.ntp.org.cn/g' /var/spool/cron/root
sed -i 's/.
\ *\ *\ *\ *\ *ntpdate\ *us.ntp.org.cn/15\ *\ *\ *\ *\ /usr/sbin/ntpdate\ us.ntp.org.cn/g' /var/spool/cron/root

扩展知识
时钟同步
有没有比ntpdate(断点式的更新时间)更优化的(步进式或微调)时间同步方式
优先chrony > 其次ntpd > ntpdate

守护进程与配置比较
ntpdate无需守护进程和配置文件,客户端cron调用即可.
而chrony,ntpd则需要搭建服务器端.且chrony还需要客户端配置.

常用ntpdate地址列表
us.ntp.org.cn 美国(当前使用)
pool.ntp.org 自动选择地区(多个节点,可能是根据DNS自动选择)
cn.pool.ntp.org 是ntp网络授时组织的中国授时源
us.pool.ntp.org 是ntp网络授时组织的美国授时源

chrony说明
chrony 是 RedHat 开发的,它是网络时间协议(NTP)的另一种实现;
RHEL/CentOS 6.x 下的时间同步使用 ntpdate 和 ntpd 这两个工具实现的,但是这两个工具已经很古老了.其他 systemd 系统下无需安装 ntp/chrony,使用 systemd-timesyncd 服务即可.
chrony是RHEL/CentOS 7.x 的默认时间同步工具,在 CentOS 6.8之后也添加上了这个工具;
chrony 可以同时做为 ntp 服务的客户端和服务端;安装完后有两个程序 chronyd、chronyc:chronyd 是一个 daemon 守护进程,chronyc 是用来监控 chronyd 性能和配置参数的命令行工具。

ntp说明
NTP(Network Time Protocol,网络时间协议)是用来使网络中的各个计算机时间同步的一种协议。它的用途是把计算机的时钟同步到世界协调时UTC,UTC是由原子钟报时的国际标准时间,而NTP获得UTC的时间来源可以是原子钟、天文台、卫星,也可从internet上面获取。其精度在局域网内可达0.1ms,在互联网上绝大多数的地方其精度可以达到1-50ms。
NTP服务器就是利用NTP协议提供时间同步服务的。
为什么要使用ntpd而不是ntpdate?
首先要理解,ntpdate和ntpd是互斥的,两者不能同时使用。而推荐使用ntpd的原因就是,ntpd是步进式平滑的逐渐调整时间,而ntpdate是断点式更新时间。
为什么说ntpd服务器是不安全的?(因为多开了个UDP 123 端口.需要使用NTP软件提供的ntpdate来连接端口123)
通讯流程 1)首先主机启动NTPd服务 2)客户端向NTP服务器发送调整时间的信息 3)NTP服务器接受后会发送当前标准时间给客户端 4)客户端收到来自NTP服务器的时间后,根据信息调整自己系统时钟,实现时间校准。

posted @ 2020-04-21 10:50  ChanixChen  阅读(511)  评论(0)    收藏  举报