什么是定时任务
在特定时间做指定的事情
例如:早上8点半准备上课
Linux系统中的定时任务
①数据备份
在业务的低谷期把重要的数据推送到备份服务器
使用tar命令打包压缩 占用cpu资源
减少磁盘IO 发送一个文件给备份服务器 一个文件会占用一次IO请求
上千个文件会占用上千次的IO
②数据统计
固定早上上班前 把昨天的某个服务的数据自动统计发送到自己和领导的邮箱
③服务管理
在特定的时间让某个服务自动运行或者让服务停止
④时间同步
时间必须保持正常
①crond 工作使用的定时任务
②atd 只执行一次 后面不执行 不适用
③anacon 非7*24小时服务器使用
④查看当前的定时任务服务是否安装
[root@heng ~]# rpm -qa cronie
cronie-1.4.11-23.el7.x86_64
⑤查看定时任务状态
[root@heng ~]# systemctl status crond
● crond.service - Command SchedulerLoaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)Active: active (running) since Wed 2021-02-03 09:32:25 CST; 5h 34min agoMain PID: 896 (crond)CGroup: /system.slice/crond.service└─896 /usr/sbin/crond -nFeb 03 09:32:25 heng systemd[1]: Started Command Scheduler.
Feb 03 09:32:25 heng crond[896]: (CRON) INFO (RANDOM_DELAY will be )
Feb 03 09:32:25 heng crond[896]: (CRON) INFO (running with inotify support)
Hint: Some lines were ellipsized, use -l to show in full.
/etc/cron.deny #拒绝某个用户不允许使用定时任务
/var/log/cron #定时任务的日志文件
/var/log/messages #系统的日志文件
/var/spool/mail #用户相关的邮件
系统相关的文件
系统日志切割
①定时任务分类
系统定时任务==> 全局
配置文件 /etc/crontab
用户定时任务==> 局部
配置文件 /var/spool/cron以当前登陆系统用户命名的文件
如果oldboy用户登陆系统
/var/spool/cron/oldboy
系统和用户的定时任务没有太大区别 所以在公司中这两种都在用或者有可能同时在用!
②查看系统的定时任务
[root@heng ~]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root# For details see man 4 crontabs# 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
③查看用户的定时任务 默认没有
第一种
[root@heng ~]# crontab -l
no crontab for root第二种
[root@heng ~]# cat /var/spool/cron/root
定时任务的配置文件两种: 定时任务含义 在特定的时候做指定的事情
第一种 : 配置在系统文件中 有root权限可编辑
/etc/crontab
第二种:配置在用户配置文件中 没有root权限
/var/spool/cron/oldboy
案例:在用户的配置文件中 凌晨执行/servser/sctips/test.sh #看oldboy用户是否有权限执行
系统的定时任务配置
vim /etc/crontab #只继承父shell的部分变量
SHELL=/bin/bash # 指定解释器为/bin/bash 当前配置文件中的内容默认都是以bash运行
PATH=/sbin:/bin:/usr/sbin:/usr/bin # 指定命令的路径变量
MAILTO=root # 邮件发送给root 文件位置 /var/spool/mail/root# For details see man 4 crontabs# Example of job definition:
# .---------------- minute (0 - 59) # 分钟 0表示整点-----59分钟
# | .------------- hour (0 - 23) # 小时 0表示凌晨12点 23表示晚上11点 ----> 0 0 表示凌晨12点整
# | | .---------- day of month (1 - 31) # 日期 1-31天
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # 月份 1-12月
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) # 周 0表示星期天 7也表示星期天 1-6 周一到周六
# | | | | |
# * * * * * user-name command to be executed
语法格式:
* * * * *
分 时 日 月 周 root 可执行的命令或者脚本
用户定时任务 默认文件为空
crontab -l #列出用户定时任务
crontab -e # 编辑用户定时任务 类似visodu 有语法检测功能
crontab -e =====> vim /var/spool/cron/root (用户的配置文件)
案例:每天上午8点半,准备来学校上车 go to school
* * * * *
30 8 * * * 执行的命令go to school # 用户定时任务
30 8 * * * root 可执行命令 # 系统配置文件先使用每分钟去测试结果在修改特定时间去执行
cat /var/log/cron
查看日志文件 是否执行成功
Feb 3 15:10:01 | heng | CROND[2005]: | (root) | CMD (echo ‘go to school’) |
---|---|---|---|---|
时间 | 主机名称 | 服务 | 用户 | 执行命令 |
案例2:每天晚上12点回家自己开车
0 12 #错误表示方式 12表示中午12点
00 00 * * * go to bed
每次备份的名字都不一样的话 不就会把之前的覆盖了吗?
最常用的备份时间 每天已备份 使用date +%F
常用的符号:
符号 | 含义 |
---|---|
* | 表示每的意思 每分钟 每小时 每天 |
* * * * * | 表示每天的每小时的每分钟 都会执行 一分钟执行一次 |
00 * * * * | 表示的每小时执行一次 1小时一次 |
/ | 间隔 |
*/5 | 间隔5分钟执行一次 |
案例3:每五分钟进行一次时间同步
*/5 * * * * ntpdate ntp1.aliyun
PS:每隔五分钟从整点开始计算 而不是当前的时间
比如当前创建完定时任务12分钟 下次执行17分钟
正确的下次执行时间为15分钟 20分钟 25分钟
案例4:间隔2小时执行一次
00 */2 * * * ntpdate ntp1.aliyun
案例5:凌晨3点钟 把回家开车的定时任务取消 如何在凌晨三点注释掉回家开车的定时任务
[root@oldboyedu ~]# crontab -l
00 12 * * * echo 'go to bed' >>/
①使用crontab实际编辑/var/spool/cron/root
②使用sed结合定时任务
在命令行进行测试
sed '/bed/s#^###g' /var/spool/cron/root
写入脚本
[root@oldboyedu ~]# cat /server/scripts/sed.sh
sed -i '/bed/s#^###g' /var/spool/cron/root
③在定时任务进行测试
④成功后修改为指定时间
- 表示区间范围
10-25 * * * * #10分钟到25分钟都执行定时任务
, 分隔
00 08,11,14 * * * # 每天的8点 11点和下午2点整 执行定时任务
00 8-11,13,17 * * * # 每天的8点到11点的整点 和下午的1点 和下午的5点整执行定时任务
案例:每分钟执行一次定时任务 把自己的姓名输出到 文件中
PS:在定时任务中超过两条以上的命令 最好写入脚本中
①在命令测试输出自己的姓名
echo 'fengzhiheng' >&
②写入脚本 脚本中的输出文件路径为当前路径
vim
③测试脚本
* * * * *
④写入定时任务 在定时任务按照每分钟进行测试
定时任务执行脚本 脚本中的当前路径为家目录
* * * * * sh /server/scripts/name.sh
⑤修改为指定时间运行
2 * * * * 每小时的第2分钟
*/2 * * * * 每2分钟
①定时任务规则前面加注释
②使用脚本来代替定时任务 超过两条以上命令使用脚本
③定时任务中的% 会识别成特殊的含义 如果获取时间 必须使用当时 或者写入脚本执行
④定时任务中执行脚本 使用bash或sh 如果不使用必须给执行权限
⑤定时任务执行的正确和错误的结果需要定向到黑洞或者文件中
ls &>/dev/null
1>在执行定时任务的时候 如果邮件服务开启 执行一次定时任务 系统会自动发送给root一封邮件
Linux中的邮件服务 postfix
每分钟 每间隔n分钟都要有发邮件的动作 发送到root的邮件对我们是否有用?
刚定义定时任务时候帮助我们排错 如果定时任务正常运行 对我们是否有意义?
root邮件对管理员来讲没有太大意义 每次执行都会占用系统的资源 降低服务器的性能
系统优化:禁止不必要的服务开机运行
2>如果我们关闭了postfix服务 系统在执行定时任务后
每条定时任务每执行一次都会生成一个临时小文件
每分钟执行10任务 每分钟系统会增加10个临时文件,60分钟增加600个小文件
生成小文件 特别小 不会占用太多block 但会占用太多inode
3?生成临时小文件的位置
4>解决方法:
方法1:
定时清空小文件的目录
*/5 * * * * rm -rf /var/spool/postfix/maildrop/*
方法2:
把定时任务的结果定向到文件或者空
&>>/data/data.log #如果结果有用则放入文件
&>/dev/null #没有用就定向到空
如何查找大量的小文件 大部分都是在某个目录下?
提示:目录本身越大 , 说明小文件越多
⑥避免不要的文件及程序输出
例如:
tar zcvf -----> tar zcf
打包尽量到相对路径 不提示删除/
案例:每天凌晨1点把/etc目录 打包备份到/tmp目录并且要求每天的备份名字不同。时间精确到秒
1>命令行测试
2>写入脚本
3>测试脚本
4>写入定时任务 按照每分钟测试
5>修改为指定时间 结果定向到空
⑦脚本中的程序文件 尽量使用绝对路径
默认在输出文件在家目录下
* * * * * echo test >> / &>/dev/null
⑧定时任务和命令位置相关的环境变量
1>定时任务在执行的时候 默认识别的路径PATH 只有bin和/usr/bin 其他路径无法识别
2>/bin/sh: ifconfig: command not found #找不到ifconfig 因为ifconfig路径为/usr/sbin
3>/etc/crontab 文件中已经重新定义了PATH变量 所以能正常执行
[root@oldboyedu ~]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
解决方法:
方法1:
在文件中重新定义PATH
[root@oldboyedu ~]# crontab -l
PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin'
* * * * * ifconfig eth0|awk 'NR==2{print $2}' >> /
[root@oldboyedu ~]#
10.0.0.200
方法2:
命令使用全路径执行
[root@oldboyedu ~]# crontab -l
* * * * * /usr/sbin/ifconfig eth0|awk 'NR==2{print $2}' >> /
方法3:
写入脚本
方式1==>重新定义PATH变量
PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin'
方式2==>使用全路径
/usr/sbin/ifconfig
方式3==>加载/etc/profile 使用 source /etc/profile 或者 . /etc/profile
source /etc/profile
ifconfig eth0|awk 'NR==2{print $2}' >> /
PS: 是不是以后写脚本 就先定义上PATH?
1.如果使用定时任务先定义PATH 或者 source
2.如果不使用定时任务 不需要定义PATH 因为子shell默认继承父shell的所有变量
1.命令执行的过程
在bash中执行命令 会找系统定义好的PATH变量
PATH变量中存着所有可执行命令的路径
[root@heng ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
执行命令会在上面的所有路径中一一查找 命令是否在上面的目录下
如果查找到则继续执行命令
如果查不到则提示 command not found
2.在执行某个脚本时候 脚本会继承父shell的所有变量
[root@oldboyedu ~]# cat test.sh
echo $PATH
[root@oldboyedu ~]# sh test.sh
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@oldboyedu ~]#
[root@oldboyedu ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
以上在脚本中查看的PATH变量 和在父shell下查看的环境变量 相同的
所以如果命令可以正常在父shell中运行 那么一定可以在子shell中正常执行
3.定时任务的配置文件 无法继承所有的PATH变量
两个定时任务配置文件
/etc/crontab
/var/spool/cron/root ====== 直接使用命令 crontab -e 编辑的
可以识别的路径 默认 只继承了 /usr/bin 和 /bin
4.ifconfig命令全路径 查找当前PATH变量的时候只在 /usr/bin 和 /bin 目录下进程查找
输入定时任务中的PATH变量的内容[root@oldboyedu ~]# crontab -l
* * * * * echo $PATH >> /
[root@oldboyedu ~]#
/usr/bin:/bin
5.如何能让ifconfig 找到自己的路径 /usr/sbin/ifconfig
PATH='/usr/bin:/bin/:/usr/sbin:'
案例1
1.下载了一个tomcat第三方服务 放入了/usr/local/tomcat 使用which无法找到
运行tomcat服务需要去哪里找tomcat的执行命令?
进入到tomcat目录找到bin目录 bin目录下放着可执行命令
2.执行的方式
第一种执行方式
cd /usr/local/tomcat/bin/tomcat
./tomcat
第二种执行方式
/usr/local/tomcat/bin/tomcat 直接运行
3.想在任意的目录可以直接运行tomcat 如何操作?
写入PATH变量即可
PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/tomcat/bin:'
写入/etc/profile永久生效
案例2
1.创建一个以ip地址命名的目录 使用命令自动获取IP
a.sed获取IPip add|grep eth0|sed -r '2s#^.*net (.*) brd.*$#1#g'|awk -F/ '{print $1}'b.awk获取IP[root@oldboyedu ~]# ifconfig eth0|awk 'NR==2{print $2}'10.0.0.200c. 命令获取[root@oldboyedu ~]# hostname -I|awk '{print $1}'10.0.0.200
[root@oldboyedu ~]# mkdir `hostname -I|awk '{print $1}'`
[root@oldboyedu ~]# ll
drwxr-xr-x 2 root root 6 Feb 4 12:08 10.0.0.200
2.并把/etc/目录打包压缩放在以IP命名的目录里面
[root@oldboyedu /]# tar zcf /root/10.0.0.200/ etc
[root@oldboyedu /]# echo /root/`hostname -I|awk '{print $1}'`/ /root/10.0.0.200/[root@oldboyedu /]# tar zcf /root/`hostname -I|awk '{print $1}'`/ etc
[root@oldboyedu /]# ll /root/10.0.0.200/total 9600-rw-r--r-- 1 root root 9828014 Feb 4 12:11
3.保持每天的压缩包名字不同
[root@oldboyedu /]# echo /root/`hostname -I|awk '{print $1}'`/`date +%F`_
/root/10.0.0.200/2021-02-04_[root@oldboyedu /]# tar -zcf /root/`hostname -I|awk '{print $1}'`/`date +%F`_ etc
[root@oldboyedu /]# ll /root/10.0.0.200/
total 19200
-rw-r--r-- 1 root root 9828014 Feb 4 12:13 2021-02-04_
4.写入脚本 为了易读 我们使用变量的方式
第一种操作
[root@oldboyedu scripts]# cat backup.sh source /etc/profile # 一定要注意定时任务中只识别 /usr/bin 和/bin的问题
#env
IP=`hostname -I|awk '{print $1}'`
Time=`date +%F`
Dir=/root/$IP
name=$Dir/$Timemkdir -p $Dir
cd /
tar -zcf ${name}_ etc
[root@oldboyedu scripts]# ll /root/10.0.0.200/
total 9600
-rw-r--r-- 1 root root 9828014 Feb 4 12:25 2021-02-04_
第二种操作
[root@oldboyedu scripts]# cat backup.sh
#env
IP=`hostname -I|awk '{print $1}'`
Time=`date +%F`mkdir -p /root/$IP
cd /
tar -zcf /root/$IP/${Time}_ etc[root@oldboyedu scripts]# sh backup.sh
[root@oldboyedu scripts]# ll /root/10.0.0.200/
total 9600
-rw-r--r-- 1 root root 9828014 Feb 4 12:27 2021-02-04_
4.每天凌晨12点准时执行
[root@oldboyedu ~]# crontab -l00 00 * * * bash /server/scripts/backup.sh #每分钟测试 然后修改为指定时间即可
本文发布于:2024-02-02 00:57:29,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170681172140365.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |