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的主要内容,如果未能解决你的问题,请参考以下文章