crontab

Posted syy1757528181

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了crontab相关的知识,希望对你有一定的参考价值。

crontab(crond)是什么?

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

秒级任务:

1.crond自身无能为力

2.但是自己可以 写守护进程shell循环(while true;do),来实现秒级任务

backup 备份

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

vim miao.sh
#!/bin/bash   命令解释器,翻译官
while true						也可以 while true;do
do
	echo oldboylinux >> /tmp/a.log
	sleep 1
done
sh miao.sh &
ps -ef|grep miao
tail -f /tmp/a.log
kill + 进程号

vim miao.sh    		#每秒输出一次到当前路径,CTRL+c结束
#!/bin/bash         
while true;do
        echo oldboy
        sleep 1
done
sh miao.sh

vim miao.sh  		#每秒输出一次到指定文件,CTRL+c结束
#!/bin/bash
while true;do
        echo oldboy>>/tmp/a.log
        sleep 1
done
sh miao.sh

vim miao.sh   		#命令行状态不变,每秒输出一次到指定文件,
#!/bin/bash
while true;do
        echo oldboy>>/tmp/a.log
        sleep 1
done
sh miao.sh &

[root@oldboy ~]# fg    停止
sh miao.sh

为什么需要定时任务:

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

linux定时任务分类:
1.系统自身的定期执行的任务
	ll /var/log/messages
	ll /var/log/secure
	
[root@oldboy ~]# ll /etc/cron  (tab 出来)
cron.d/       cron.deny     cron.monthly/ cron.weekly/  
cron.daily/   cron.hourly/  crontab

[root@c7 ~]# vim /var/spool/cron/root    定时任务本身的(crontab -e的编辑)


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  #可以使用systemctl来管理
/usr/sbin/crond
/var/spool/cron   #crontab -e 编辑的文本
/var/log/cron  #crontab 的日志,判断定时任务是否执行成功,但是有些复杂的命令显示执行成功,但是实际上执行失败
[root@oldboy ~]# rpm -qc cronie  # 找不到/etc下面的crontab
/etc/cron.d/0hourly
/etc/cron.deny
/etc/pam.d/crond
/etc/sysconfig/crond
/etc下面的crontab

[root@oldboy ~]# ll /usr/lib/systemd/system/crond.service  crontab可以使用systemctl来管理
-rw-r--r--. 1 root root 318 Aug  9  2019 /usr/lib/systemd/system/crond.service
[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 ~]# ll /etc/systemd/system/multi-user.target.wants/crond.service 
#查看crontab是否是开机自启动
lrwxrwxrwx. 1 root root 37 Apr 18 22:09 /etc/systemd/system/multi-user.target.wants/crond.service -> /usr/lib/systemd/system/crond.service

[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

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 网站正常运行 >/tmp/1.txt
else
	echo 网站没了 >/tmp/1.txt
fi

crontab -e
00 6 * * * /usr/bin/sh /etc/prfile.d/panduanwangzhan.sh
00 6 * * * /usr/bin/mail -s ‘宋阳阳的网站运行情况报告‘ xxxxxx@qq.com </tmp/1.txt

--------------或者
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
----------------
vim /etc/profile.d/panduanwangzhan1.sh
#!/bin/bash
a=$(curl -I -m 10 -o /dev/null -s -w %{http_code} http://10.0.0.8)
if [ $a -eq 200 ];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 就不会curl出来了
  % 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
https://images.cnblogs.com/cnblogs_com/syy1757528181/1750749/t_2004251429320d338744ebf81a4c8b3fbfaadb2a6059252da640.png?a=1587898462710
file:///C:/Users/Administrator/Desktop/QQ%E5%9B%BE%E7%89%8720200426185211.jpg

# 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"

#echo 后面不能用反引号,命令行可以用(注意echo转义括号)

xxxxxxxxxxxxxxxxxxxxxxxxx

# 日志切割


[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用户发邮件
(2>a.txt &>/dev/null 可以避免这种烦人的输出)
You have new mail in /var/spool/mail/root #


# 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的时候要注释( 执行目的 执行时间 姓名)



##定时任务潜规则:
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@qls ~]# ntpdate
[root@oldboy ~]# ntpdate         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
You have new mail in /var/spool/mail/root #


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


[root@oldboy ~]# tailf /var/log/cron   crontab 的日志(每一次执行,时间 用户 命令),日志输出,在某个配置文件里指定了这个日志的位置

[root@oldboy ~]# nginx -t 2>/tmp/nginx.txt
[root@oldboy ~]# cat /tmp/nginx.txt
* * * * * /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
[root@oldboy ~]# cat /tmp/nginx.txt crontab里以相对路径表示该命令出错(日志显示执行,实际没有结果 )
/bin/sh: nginx: command not found #命令行环境变量下面没有这个命令

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" 不能用单引号,必须加个exrort 记得source或者bash)
a=1
a=$a + 1

[root@oldboy ~]# a=ls      a只是一个变量,可执行文件才能使用环境变量
[root@oldboy ~]# a
bash: a: command not found



#环境变量的作用:
在 环境变量里面 的命令(二进制文件)(服务的启动程序)(普通的可执行文件)必须是 可执行文件,才有意义
1.可以不用绝对路径的方式来表示
2.可以在任何目录下TAB出来(补全)
[root@oldboy ~]# vim syy
ls
[root@oldboy ~]# shmod u+x syy       给他执行权限,让该文件变成可执行文件
[root@oldboy ~]# export PATH="/opt/:$PATH"   
[root@oldboy ~]# echo $PATH   # 增加,删除
/opt/:/opt/:/app/nginx-   1.16.1/sbin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@oldboy ~]# mv syy /opt/  
[root@oldboy ~]# syy
1      1.zip            a.txt 

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

crontab的时间编写规范

不能指定秒,年

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

最大是月,最小是分,2:00-3:00,*/5互不影响,(两位数时间,一位数时间),0/3(不能这样写,写*/3)

* * 1 * *               #每月一号的每一分钟都会执行
00 00 1 * *

* * * * *
*/1 * */1 * * 			# 专业(加不加的问题)

* 2 * * *                不能这样写,执行了60次,不指定数字就自己加个数字
00 2 * * *

每两小时(N)和每隔一个小时(N-1) 一个意思
00 */2 * * *			#每2小时的每00分
* */2 * * *              每两个小时的每分钟
*/2 */2 * * *			每两个2:02小时

*/30 6 * * * /bin/sh /scripts/zls.sh  =  6:00  6:30  
30 6 * * * /bin/sh /scripts/zls.sh  =  6:30 

30 */6 * * * /bin/sh /scripts/zls.sh     # 每6个小时的30分执行一次脚本
*/30 */6 * * * /bin/sh /scripts/zls.sh	 # 每6:30个小时执行一次脚本	




00 02 * * * ls           每天的凌晨2点整执行
00 02 1 * * ls           每月的1日的凌晨2点整执行

00 12 1,15 * * /bin/ls  # 每月1号和15号12点都行一次ls命令 (,不连续)
00 12 1-15 * * /bin/ls  # 每月1号到15号12点都行一次ls命令  (- 连续)

14 02 14 2 * ls          每年的2月14日凌晨2点14分执行

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点执行  

*/10  02 * * * ls       #每天凌晨2点,每隔10分钟执行一次(要3点停止)

* * * * *  ls           每分钟都执行(分钟是最小单位)
*/1 * * * *  ls			#每分钟都执行 (从保存的那一刻开始计算)

00 00 14 2 *  ls        每年2月14日的凌晨执行命令 
*/5 * * * *  ls         每隔5分钟执行一次

00 02 * 1,5,8 * ls      #每年的1月5月8月 每月 凌晨2点执行 (, 不连续)
00 02 * 1-5,8-10 * ls  #每年的1月到5月 8月到10月 每月 凌晨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 * * 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不会执行

15 21 * * 1-5 ls        #周一到周五每天晚上21:15执行

以上是关于crontab的主要内容,如果未能解决你的问题,请参考以下文章

利用crontab自动更新SVN代码

crontab每秒执行URL接口

linux crontab定时任务调用CI框架PHP代码

linux定时执行php代码-定时计划crontab

django-crontab定时任务

crontab Linux下 crontab 命令的用法:sudo crontab -?