跨行学Linux运维 定时任务

阅读: 评论:0

跨行学Linux运维   定时任务

跨行学Linux运维 定时任务

文章目录

  • 1.定时任务介绍
  • 2.定时任务分类
  • 3.定时任务相关配置文件
  • 4.定时任务使用流程
  • 5.定时任务书写流程
  • 6.定时任务注意事项
  • 7.脚本和定时任务的变量
  • 8.定时任务案例

1.定时任务介绍

什么是定时任务
在特定时间做指定的事情
例如:早上8点半准备上课

Linux系统中的定时任务

①数据备份
在业务的低谷期把重要的数据推送到备份服务器
使用tar命令打包压缩 占用cpu资源
减少磁盘IO 发送一个文件给备份服务器 一个文件会占用一次IO请求
上千个文件会占用上千次的IO

②数据统计
固定早上上班前 把昨天的某个服务的数据自动统计发送到自己和领导的邮箱

③服务管理
在特定的时间让某个服务自动运行或者让服务停止

④时间同步
时间必须保持正常

2.定时任务分类

①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.

3.定时任务相关配置文件

/etc/cron.deny #拒绝某个用户不允许使用定时任务
/var/log/cron #定时任务的日志文件
/var/log/messages #系统的日志文件
/var/spool/mail #用户相关的邮件

系统相关的文件
系统日志切割

4.定时任务使用流程

①定时任务分类
系统定时任务==> 全局
配置文件 /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用户是否有权限执行

5.定时任务书写流程

系统的定时任务配置

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:01hengCROND[2005]:(root)CMD (echo ‘go to school’)
时间主机名称服务用户执行命令

案例2:每天晚上12点回家自己开车
0 12 #错误表示方式 12表示中午12点

    • #错误表示方式 凌晨12点的每分钟都执行一次
      0 0 #正确的凌晨12点表示方式 也可以写成 00 00 * * *

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分钟都执行定时任务

  • 8-11 * * * # 上午8点到11点的每分钟执行定时任务
    00 8-11 * * * # 上午8点整 9点整 10点整 11点整 执行定时任务

, 分隔
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分钟

6.定时任务注意事项

①定时任务规则前面加注释
②使用脚本来代替定时任务 超过两条以上命令使用脚本
③定时任务中的% 会识别成特殊的含义 如果获取时间 必须使用当时 或者写入脚本执行
④定时任务中执行脚本 使用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的所有变量

7.脚本和定时任务的变量

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:'

8.定时任务案例

案例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小时内删除。

标签:跨行   Linux   运维
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23