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/ #每个普通用户如果设置定时任务,就会在词目录下生成一个以用户名命名的家目录
定时任务潜规则:
- 可执行文件最好要使用(避免出错) #绝对路径
- 不能使用 复杂的命令行,不在当前环境变量里的命令(可以认为所有的基本命令都在PATH=/sbin:/bin:/usr/sbin:/usr/bin 里面)(复杂的命令写到脚本里,然后再在crontab -e 的时候执行就可以了)
- 所有输出放到 2>/tmp/a.txt &>/dev/null # 需要的留下来,不需要的丢到黑洞(crond -e 不认识变量,&不属于变量)
- 必须要有注释 # 方便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 "同步时间成功。"