crontab

crontab(crond)是什么?

crond是linux系统中用来 定期执行命令 或者 指定程序任务 的一种服务或者软件

秒级任务:
1.crond自身无能为力
2.但是自己可以 写守护进程shell循环(while true;do),来实现秒级任务

mkdir /etc/profile.d/server/scripts -p  #写到全局环境变量里面,防止脚本不加载
cd /etc/profile.d/server/scripts

[root@lb01 /etc/profile.d/server/scripts]# vim miao.sh
#!/bin/bash   
while true						#也可以写 while true;do
do
	echo oldboylinux >> /tmp/a.log
	sleep 1
done
[root@lb01 /etc/profile.d/server/scripts]# sh miao.sh   #CTRL+c可以停止秒级任务的执行,&符可以把进程放到后台

#过滤后台进程
[root@lb01 ~]# ps -ef|grep miao.sh
root      15020  14164  0 00:11 pts/1    00:00:00 sh miao.sh
root      15154  13718  0 00:13 pts/0    00:00:00 grep --color=auto miao.sh
[root@lb01 ~]# ps -ef|grep [m]iao.sh
root      15020  14164  0 00:11 pts/1    00:00:00 sh miao.sh

#追踪自定义日志
[root@lb01 ~]# tail /tmp/a.log -f
oldboylinux
oldboylinux
...

# 杀死后台进程
kill + 进程号 
pkill + 服务

为什么需要定时任务:
服务器:7*24小时开机提供服务是网站的基本特征
备份重要数据(最好一天一次),服务器上的数据一般最低1天备份一次,每分钟(实时备份,一般半夜备份)(备份完成echo,或者发邮件),所以说需要定时任务

linux定时任务分类:
1.系统自身的定期执行的任务
[root@lb01 ~]# ll /var/log/{messages,secure}
-rw------- 1 root root 13806 Feb  2 00:20 /var/log/messages
-rw------- 1 root root 11588 May  2  2020 /var/log/secure
	
2.手动设置的定时任务

[root@oldboy ~]# yum provides crontab
[root@oldboy ~]# yum provides crond   #结果一样,都可以下载相同的包
[root@oldboy ~]# rpm -q cronie
cronie-1.4.11-23.el7.x86_64
[root@oldboy ~]# rpm -ql cronie
/etc/cron.d
/etc/cron.d/0hourly
/etc/cron.deny
/etc/pam.d/crond
/etc/sysconfig/crond
/usr/bin/crontab  #库文件
/usr/lib/systemd/system/crond.service  #说明crontab可以使用systemctl来管理
/usr/sbin/crond
/var/spool/cron   #crontab -e 编辑的文本
/var/log/cron  #crontab 的日志,判断定时任务是否执行成功,但是有些复杂的命令显示执行成功,但是实际上执行失败

[root@lb01 ~]# ll /etc/systemd/system/multi-user.target.wants/crond.service   # 说明crontab是开机自启动的
lrwxrwxrwx. 1 root root 37 May  1  2020 /etc/systemd/system/multi-user.target.wants/crond.service -> /usr/lib/systemd/system/crond.service

[root@oldboy ~]# rpm -qc cronie  # 找不到/etc/crontab,该文件是crontab的配置文件
/etc/cron.d/0hourly
/etc/cron.deny
/etc/pam.d/crond
/etc/sysconfig/crond

[root@lb01 ~]# which crontab
/usr/bin/crontab
[root@lb01 ~]# ll /usr/bin/crontab 
-rwsr-xr-x. 1 root root 57656 Aug  9 07:07 /usr/bin/crontab

#查看当前的运行级别
[root@oldboy ~]# runlevel  
N 3
[root@oldboy ~]# ll /etc/systemd/system/default.target  
lrwxrwxrwx 1 root root 41 Apr 26 06:59 /etc/systemd/system/default.target -> /usr/lib/systemd/system/multi-user.target  


[root@oldboy ~]# systemctl status crond   # 绿色,crond开机自启
● crond.service - Command Scheduler

 
[root@oldboy ~]# curl -I http://10.0.0.8/  curl 自己的正在运行的源码nginx页面,200=可以正常打开,状态码不是200就不是正常状态,curl出来的状态码就是nginx页面上显示的状态码,企业可以用curl来检查网站的状态

HTTP/1.1 200 OK       #
Server: nginx/1.16.1
Date: Sun, 26 Apr 2020 09:16:22 GMT
Content-Type: text/html
Content-Length: 661
Last-Modified: Sun, 26 Apr 2020 09:02:00 GMT
Connection: keep-alive
ETag: "5ea54e08-295"
Accept-Ranges: bytes

#使用curl命令检查指定的网站运行情况
vim /etc/profile.d/panduanwangzhan1.sh
#!/bin/bash
a=$(curl -s -I http://10.0.0.8/|awk 'NR==1{print $2}')
if [ $a -eq 200 ];then
	echo 网站正常运行 | /usr/bin/mail -s 'syy的网站运行情况报告' xxxxxx@qq.com >/dev/null
else
	echo 网站没了 | /usr/bin/mail -s 'syy的网站运行情况报告' xxxxxx@qq.com >/dev/null
fi

#编辑定时任务
crontab -e
### 执行目的 执行时间 执行人
00 6 * * * /usr/bin/sh /etc/prfile.d/panduanwangzhan.sh

# 还可以根据端口判断网站运行状态
vim /etc/profile.d/panduanwangzhan2.sh
#!/bin/bash
a=$(ps -ef|grep [n]ginx|wc -l)   
if [ $a -gt 0 ];then
	echo 网站正常运行 >/tmp/1.txt
else
	echo 网站没了 >/tmp/1.txt
fi


[root@oldboy ~]# curl -I http://10.0.0.8/|awk 'NR==1{print $2}' &>>/dev/null 
#前3行内容既不是正确输出,又不是错误输出,curl -s 就不会显示这个烦人的输出了
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0   661    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
200

# loub 巡检报告脚本
vim a.txt
#!/bin/bash
used=`df -h|awk 'NR==2{print $3}'`
free=`df -h|awk 'NR==2{print $4}'`
process_count=`ps -ef|grep [n]ginx|wc -l`
prot=`netstat -lntup|grep 80|wc -l`
status_code=`curl -I -m 10 -o /dev/null -s -w %{http_code} http://10.0.0.8`
echo "-------------------------disk info\( 磁盘信息\) ---------------------------"
echo "磁盘已使用:$used"
echo "磁盘空闲:$free"
echo "-------------------------nginx info\( nginx信息\) ---------------------------"
echo "nginx的进程数:$process_count"
echo "nginx的端口数:$prot"
echo "nginx页面状态码:status_code"

crontab -e
...

# 日志切割
[root@oldboy ~]# ll /bin/false 
-rwxr-xr-x. 1 root root 28928 Aug 20  2019 /bin/false
[root@oldboy ~]# file /bin/false 
[root@oldboy ~]# /bin/false 

[root@oldboy ~]# echo $?    这个文件不管有没有执行成功,echo $? 都不会是0
1

Crontab配置文件解析

[root@zls ~]# vim /etc/crontab
SHELL=/bin/bash                     #执行命令的解释器(不同的系统有不同的命令解释器)
PATH=/sbin:/bin:/usr/sbin:/usr/bin  # crontab 脚本里的环境变量
MAILTO=root                         #如果定时任务执行报错,会给root用户发邮件

如 :You have new mail in /var/spool/mail/root 
#2>a.txt 或者 &>/dev/null 可以避免这种烦人的输出


# 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

# *  表示任意的(分、时、日、月、周)时间都执行
# -  表示一个时间范围段, 如5-7点
# ,  表示分隔时段, 如6,0,4表示周六、日、四
# /1 表示每隔n单位时间, 如*/10 每10分钟

[root@oldboy ~]# mail  查看有没有报错邮件
No mail for root

# 环境变量 命令行上面的PATH环境与crontab脚本里的PATH环境不一样,所以在写定时任务时最好使用命令的 绝对路径 去执行 ( 先which 一下,再crontab -e使用该命令 )
crontab命令选项
参数	含义
-e	编辑定时任务 
-l	查看定时任务 
-r	删除所有当前用户的定时任务  # 或者 crontab -e ,再删除(删除一部分或所有)
-u	   指定其他用户(root用户才能指定)
root用户可以使用 crontab -r -u xx 删除指定用户的定时任务
root用户可以使用 crontab -l -u xx 查看指定用户的定时任务
root用户可以使用 crontab -e -u xx 编辑指定用户的定时任务

root用户 可以检查 /var/spool/cron/ 下的定时任务,所以普通用户crontab -e的时候要注释( 执行目的 执行时间 姓名)
[root@lb01 ~]# ll /var/spool/cron/  #每个普通用户如果设置定时任务,就会在词目录下生成一个以用户名命名的家目录

定时任务潜规则:

  1. 可执行文件最好要使用(避免出错) #绝对路径
  2. 不能使用 复杂的命令行,不在当前环境变量里的命令(可以认为所有的基本命令都在PATH=/sbin:/bin:/usr/sbin:/usr/bin 里面)(复杂的命令写到脚本里,然后再在crontab -e 的时候执行就可以了)
  3. 所有输出放到 2>/tmp/a.txt &>/dev/null # 需要的留下来,不需要的丢到黑洞(crond -e 不认识变量,&不属于变量)
  4. 必须要有注释 # 方便root用户检查定时任务

定时任务 编辑过程

1.命令行,测试是否能执行成功
2.加快定时的频率(实验每分钟的执行结果),测试定时任务是否能执行成成功
3.修改成目标时间,定时任务设置完成

[root@qls ~]# yum install -y ntpdate  
[root@oldboy ~]# ntpdate         
26 Apr 15:49:14 ntpdate[1536]: no servers can be used, exiting
[root@oldboy ~]# ntpdate time1.aliyun.com
26 Apr 15:51:19 ntpdate[1548]: step time server 203.107.6.88 offset 8.808498 sec

# 每五分钟跟阿里云同步一次系统时间 日期:xxx 谁:xxx
*/5 * * * * /usr/sbin/ntpdate time1.aliyun.com &>/dev/null
#*/5 * * * * /usr/sbin/ntpdate time1.aliyun.com 2>>/tmp/a.txt &>/dev/null 

# 追踪crontab日志,可以检测定时任务是否执行成功
[root@oldboy ~]# tailf /var/log/cron   # crontab 的日志(每一次执行,时间 用户 命令),日志输出,在某个配置文件里指定了这个日志的位置

定时任务的简单设置

[root@oldboy ~]# crontab -e
* * * * * /app/nginx/sbin/nginx -t 2>/tmp/nginx.txt

[root@oldboy ~]# tailf /var/log/cron
Apr 26 20:18:01 oldboy CROND[2655]: (root) CMD (/app/nginx/sbin/nginx -t 2>/tmp/nginx.txt)

[root@oldboy ~]# cat /tmp/nginx.txt  
# 总结:定时任务里面,要考虑命令行里面的环境变量 和脚本里的环境变量的差异,不是所有的命令都可以以 相对路径的方式在crontab脚本里执行,所以为了省时省力,在crontab脚本里 统一以绝对路径的方式表示命令
nginx: the configuration file /app/nginx-1.16.1/conf/nginx.conf syntax is ok
nginx: configuration file /app/nginx-1.16.1/conf/nginx.conf test is successful

环境变量

简单分类:
1.命令行里面的环境变量
2.shell脚本里面的环境变量
3.系统自带命令环境变量
4.自己添加的环境变量

PATH=/sbin:/bin:/usr/sbin:/usr/bin  # crontab 脚本里的环境变量
[root@oldboy ~]# echo $PATH  #命令行的变量环境
/app/nginx-1.16.1/sbin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
#让某个命令(或服务的启动程序)加入环境变量
echo 'exrort PATH="/app/nginx/sbin:$PATH"'>>/etc/profile.d/nginx.sh   
#注意PATH前后代表的变量 (source 之后才会生效)(注意"/app/nginx/sbin:$PATH" 不能用单引号, 记得source或者bash之后才会生效)

自己尝试做一个命令

a=1
a=$a + 1

[root@oldboy ~]# a=ls     
[root@oldboy ~]# a
bash: a: command not found

#环境变量的作用:
在 环境变量里面 的命令(二进制文件)(服务的启动程序)(普通的可执行文件)必须是 可执行文件,才有意义
1.可以不用绝对路径的方式来表示
2.可以在任何目录下TAB出来(补全)

[root@oldboy ~]# vim syy
ls
[root@oldboy ~]# shmod u+x syy
[root@lb01 ~]# /root/syy 
2020-05-01-23:09_lb01.etc.t  a.sh	      ef     kk  syy
       
[root@oldboy ~]# export PATH="/root/syy:$PATH"   
[root@oldboy ~]# echo $PATH   # 增加,删除
/root/syy:/app/nginx-1.16.1/sbin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin 
[root@oldboy ~]# syy
2020-05-01-23:09_lb01.etc.t  a.sh	      ef     kk  syy
[root@lb01 /tmp]# syy
a.log		  root

crontab的时间编写规范

时间参考网站

分		时		日		月		周(# 特殊)
*		 *		  *		   *		*                            ls
0-59     0-23      1-31     1-12     1-7(周日 可以是0或者7)         命令

#小心每分钟执行
* * 1 * *               #每月一号的凌晨12点后每一分钟都会执行,执行一个月
00 00 1 * *             #每月一号的凌晨12点执行
* * * * *               #每分钟都会执行 
*/1 * */1 * * 		#每分钟都会执行
* 2 * * *               #每天2点开始,每分钟执行一次,执行一个小时,执行了60次
00 2 * * *              #每天两点执行一次

#每两小时(N)和每隔一个小时(N-1) 一个意思
*/30 6 * * *            #6:00  6:30  执行2次
30 6 * * *              #6:30  执行一次
30 */6 * * *            # 每6个小时的30分执行一次脚本
*/30 */6 * * *          # 每6个小时 每30分钟执行一次脚本	

#连续时间和不连续时间
00 12 1,15 * *           # 每月1号和15号12点都执行 (,不连续)
00 12 1-15 * *           # 每月1号到15号12点都执行  (- 连续)

#日和周同时指定的时候
00 02 14 * 7 ls         #每月14日并且是周日 凌晨2点都执行 (当 日 和 周 同时出现的时候,两个条件都要满足才会执行)  



45 4 1,10,22 * * ls     #每月的1,10,22号的4:45执行
45 4 1-10 * * ls        #每月的1到10号的4:45执行
3,15 8-11 */2 * * ls    #每隔两天的上午8点到11点的第3和第15分钟执行
0 23-7/1 * * * ls       #晚上23点到早上7点之间,每隔一个小时执行  23:00点会执行,8:00不会执行

#!/bin/bsah

echo "Hello World"

#udp/123

#安装软件

yum install ntp -y &> /dev/null && echo "软件安装成功。"

#同步时间

ntpdate ntp1.aliyun.com &> /dev/null && echo "时间同步成功。"

echo "ntpdate ntp1.aliyun.com" >> /etc/rc.local  && echo "时间同步写入开机自启。"

chmod +x /etc/rc.d/rc.local

cat <<EOF > /bin/ntpdate.sh && echo "时间同步脚本写入完成。"

#!/bin/bash

ntpdate ntp1.aliyun.com

EOF

chmod +x /bin/ntpdate.sh

#echo "0 * * * * /bin/ntpdate.sh" > conf && crontab conf && echo "时间同步写入计划任务。"&& rm -f conf

(crontab -l;echo "0 * * * * /bin/ntpdate.sh > /dev/null 2>&1 ") | crontab

date && echo  "同步时间成功。"
posted @ 2020-05-01 17:04  看萝卜在飘  阅读(315)  评论(0编辑  收藏  举报