第十四篇:定时任务服务

定时任务服务使用流程

定时任务:用户在指定的时间自动执行脚本或命令

  服务使用流程

服务使用流程 说明
部署 安装这个服务或软件
配置 通过配置文件和命令使用这个服务
优化或注意事项 安全
排障
  • 通过错误提示解决
  • 查询日志(没有日志:crond服务没有运行)
  • 让服务输出错误提示或输出更加详细的错误提示
其他
  • 监控
  • 备份
  • 日志收集
  • 统一认证

  部署定时任务

  • crond:是一个守护进程,用来执行定时任务表(crontab)定义好的任务
  • cronie:定时任务软件包名字
  • crontab:定时任务管理的命令,对定时任务的规则进行增删改查
rpm -qa cronie    # 检查软甲包是否安装
rpm -ql cronie    # 查看软件包中的内容
目录结构 说明
/var/spool/cron/ 用户定时任务的配置文件的目录
/var/log/cron 定时任务日志
/etc/crontab 系统定时任务的配置文件(不推荐使用)
/etc/cron.hourly/ 系统定时任务,每小时运行
/etc/cron.daily/ 系统定时任务,每天运行
/etc/cron.weekly/ 系统定时任务,每周运行
/etc/cron.monthly/ 系统定时任务,每月运行

  配置定时任务

 配置命令

crontab:对定时任务的规则进行增删改查

crontab选项    
crontab -e edit编辑当前用户的定时任务 vim /var/spool/cron/root #root当前用户的名称
crontab -l list查看当前用户的定时任务 cat /var/spool/cron/root #root当前用户的名称
复制代码
[root@yuan ~]# crontab -l
no crontab for root  
    # 用户未设置定时任务

[root@yuan ~]# crontab -e
no crontab for root - using an empty one
    # 用户未设置定时任务,给你创建一个空的

crontab: installing new crontab
  # 更新了新的定时任务的配置
复制代码

 定时任务时间书写格式

 定时任务时间部分的特殊符号

时间符号 说明 案例
/ 每隔…时间 */2 * * * *   每隔2分钟运行
- 表示范围 00 08-22 * * *   08-22点的每个小时运行
, 表示独立的时间 00 08,12,14 * * *   08,12,14点运行
* 每,全部/所有

*在分钟的位置上:表示每分钟的意思

*在小时的位置上:表示每小时的意思

  排障

  • 没有日志(crond、rsyslog服务没有运行)
  • 没有结果(手动运行对应的脚本或命令)
  • 调试脚本
复制代码
# 调试脚本的方法
sh -x 或 bash -x,显示脚本执行过程
    以+开头的表示脚本执行的过程
    开头没有+,表示输出

[root@yuan ~]# sh -x /tmp/sys.log 
++ hostname
+ hostname=yuan
++ hostname -I
+ ip='10.0.0.200 '
+ echo '####基础信息####'
####基础信息####
复制代码

定时任务案例

  案例01:每两分钟同步系统的时间

  • 时间+命令格式
  • ntpdate ntp1.aliyun.com
# 书写在定时任务配置文件

# 注释
*/2 * * * * /sbin/ntpdate ntp1.aliyun.com
             命令写绝对路径

  案列02:每天定时备份/etc/到/backup/下面

# 创建脚本文件及写入命令
    mkdir -p /my_server/scripts
    vim /my_server/scripts/backup-etc.sh  (脚本文件以.sh .bash结尾)
    tar zcf /backup/etc-`date +%F_%w`.tar.gz /etc/
# 定时备份
    # 注释
    00 00 * * * /bin/sh /my_server/scripts/backup-etc.sh

  案例03:打包备份(脚本+变量)

在脚本中需要重复使用的内容,可以将内容存到变量中

复制代码
# Linux变量命名规则
    Linux中变量命名需以字母或下划线开头
    可包含字母、数字和下划线
    且区分大小写
    不能含空格或特殊字符

# 赋值、取值
    # 写入固定的内容
        dir='/my_server/scripts/'
        echo $dir
    echo ${dir}
# 写入命令(变量中存放的时命令的结果) now_time=`date +%F_%T` echo $now_time
复制代码

[root@yuan ~]# cat /my_server/scripts/backup-etc.sh 
#!/bin/bash
time=`date +%F_%w_%H`
tar zcf /backup/etc-$time.tar.gz /etc/

定时任务故障案例

  定时任务直接书写的时候%有特殊含义

* * * * * /bin/echo "Hello World %100" >>/root/yuan.txt 2>&1
    # 文件中不会输入任何的内容
* * * * * /bin/echo "Hello World \%100" >>/root/yuan.txt 2>&1
    # 文件中输入对应的内容

# 如果使用脚本,则不会出现该故障

  定时任务中关于命令路径的故障

  • 定时任务运行命令或脚本时,只能识别/bin或/usr/bin目录下的命令
  • 只要不在这些目录下的命令,就要使用绝对路径或重新定义PATH环境变量
复制代码
# 现象
    命令行执行命令或脚本是成功的,在定时任务中执行时,提示命令找不到
# 原因
    定时任务运行脚本或命令时只能识别/bin和/usr/bin目录下的命令,其他的命令无法识别
# 解决办法
    绝对路径
    在脚本开头,重新定义PATH环境变量或重新加载PATH环境变量
        PATH Linux环境变量,存放命令的位置
        Linux会在PARH路径中查找,如果有则执行,如果没有则提示command not found/ no such file or directory
# 绝对路径
    [root@yuan ~]# cat /my_server/scripts/test-info.sh 
    #!/bin/bash
    hostname
    /sbin/ip address show eth0

# 重新定义PATH
    [root@yuan ~]# cat /my_server/scripts/test-info.sh 
    #!/bin/bash
    export
    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
    hostname
    ip address show eth0

# 重新加载PATH
    [root@yuan ~]# cat /my_server/scripts/test-info.sh 
    #!/bin/bash
    source /etc/profile    # 重新加载PATH环境变量
    hostname
    ip address show eth0
复制代码

  没有定向到空或追加到文件故障案例

  • 定向到空   * * * * * /sbin/ntpdate ntp1.aliyun.com >/dev/null 2&1
  • 追加到文件   00 01 * * * /bin/sh -x /my_server/scripts/backup-etc.sh >>/tmp/script.log 2>&1
复制代码
# 现象
    邮件服务开启:不断收到邮件
        (You have new mail in /var/spool/mail/root)
    邮件服务关闭:一些邮件的临时目录不断堆积成小文件
        (/var/spool/postfix/maildrop)

# 原因
    定时任务运行命令或脚本时,命令或脚本有输出,定时任务就会通过邮件形式发送给root

# 解决
    定时任务中命令或脚本定向到空或追加到文件
定向到空:*/2 * * * * /sbin/ntpdate ntp1.aliyun.com &>/dev/null
追加到文件:* * * * * /bin/echo "Hello World \%100" >>/root/yuan.txt 2>&1
复制代码

定时任务使用案例

  定时备份/etc/目录到/backup以ip地址为名的目录中

  定时系统巡检(定时输出系统基本信息)

脚本文件:/tmp/sys.log

复制代码
#!/bin/bash
#author:yuanxiaojiang
#desc:系统巡检基本脚本
#version:1


# 1.基础信息
hostname=`hostname`
ip=`hostname -I`
echo '####################基础信息####################'
echo "主机名:$hostname"
echo "ip地址:$ip"
echo '################################################'

#2.负载信息
load1=`uptime |awk -F '[ ,]+' '{print $(NF-2)}'`
load5=`uptime |awk -F '[ ,]+' '{print $(NF-1)}'`
load15=`uptime |awk -F '[ ,]+' '{print $(NF)}'`
echo '####################负载信息####################'
echo "最近1分钟:$load1"
echo "最近5分钟:$load5"
echo "最近15分钟:$load15"
echo '################################################'

#3.内存信息
mem_total=`free |awk -F '[ ]+' 'NR==2 {print $2}'`
mem_used=`free |awk -F '[ ]+' 'NR==2 {print $3+$6}'`
mem_used_percent=`free |awk -F '[ ]+' 'NR==2 {print ($3+$6)/$2*100"%"}'`
echo '####################内存信息####################'
echo "内存总计:$mem_total"
echo "内存使用:$mem_used"
echo "内存使用率:$mem_used_percent"
echo '################################################'

#4.swap信息
swap_total=`free |awk -F '[ ]+' 'NR==3 {print $2}'`
swap_used=`free |awk -F '[ ]+' 'NR==3 {print $3}'`
swap_used_percent=`free | awk -F '[ ]+' 'NR==3 {if ($2!=0) {print $3/$2*100"%"} else {print "无swap"}}'`
echo '####################内存信息####################'
echo "swap总计:$swap_total"
echo "swap使用:$swap_used"
echo "swap使用率:$swap_used_percent"
echo '################################################'

#5.磁盘信息
disk_total=`fdisk -l |grep '/dev/[sv]d[a-z][::]' |wc -l`
root_size=`df -h |awk '$NF=="/"{print $2}'`
root_size_percent=`df -h |awk '$NF=="/"{print $5}'`
echo '####################磁盘信息####################'
echo "磁盘数量:$disk_total"
echo "根分区大小:$root_size"
echo "根分区使用率:$root_size_percent"
echo '################################################'

#6.进程信息
proc_total=`top -bn1 |awk 'NR==2{print $2}'`
proc_running=`top -bn1 |awk 'NR==2{print $4}'`
proc_stopped=`top -bn1 |awk 'NR==2{print $8}'`
proc_zombie=`top -bn1 |awk 'NR==2{print $10}'`
echo '####################内存信息####################'
echo "进程总数:$proc_total"
echo "运行的进程:$proc_running"
echo "挂起进程:$proc_stopped"
echo "僵尸进程:$proc_zombie"
echo '################################################'
/tmp/sys.log
复制代码

  发送邮件

 获取授权码

 Linux配置/etc/mail.rc

复制代码
vim /etc/mail.rc  #写到该配置文件最后面

# 未加密的方式发送(25端口)
    set from=your_mail@163.com    # 发件人地址
    set smtp=smtp.163.com    # 指定SMTP服务器的地址和端口
    set smtp-auth-user=your_mail@163.com    # 设置SMTP身份验证的用户名
    set smtp-auth-password=授权码    # 设置SMTP身份验证的密码(授权码)
    set smtp-auth=login    # 指定SMTP身份验证的方法

# 加密的方式发送(465端口)
    set nss-config-dir=/etc/pki/nssdb/    # 指定NSS配置目录(通常用于存储证书和密钥的数据库)
    set smtp-user-starttls    # 启动STARTTLS,提高安全性
    set ssl-verify=ignore    # 配置SSL验证为忽略
    set from=your_mail@163.com
    set smtp=smtps://smtp.163.com:465
    set smtp-auth-user=your_mail@163.com
    set smtp-auth-password=授权码
    set smtp-auth=login
复制代码

 发送邮件及其附件

# 发送邮件
    mail -s "邮件主题" recipient@example.com <邮件内容
# 发送邮件及其附件
    echo "邮件附件" |mail -s "邮件主题" -a 邮件内容 recipient@example.com
将邮件内容转换成csv表格(通过逗号分隔内容)

 

posted @   猿小姜  阅读(34)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示