Linux基础24 定时任务, 发邮件, date命令

发布时间 2023-06-05 16:21:48作者: 战斗小人

date命令

[root@localhost ~]# date
2023年 06月 01日 星期四 00:57:36 CST
[root@localhost ~]# date +%F
2023-06-01
[root@localhost ~]# date +%F-%T
2023-06-01-01:17:37
[root@localhost ~]# date +%Y
2023
[root@localhost ~]# date +%m
06
[root@localhost ~]# date +%d
01
[root@localhost ~]# date +%H
01
[root@localhost ~]# date +%M    # 分钟
20
[root@localhost ~]# date +%S    # 秒
19
[root@localhost ~]# date +%Y%m%d%H%M%S    # 年月日时分秒
20230601012125

# 设置时间
date -s '2000-12-20'
#向阿里同步时间
yum install ntpdate
ntpdate time1.aliyun.com

 


定时任务:

crond就是计划任务,类似于我们平时生活中的闹钟,定点执行。

 

企业需求:定时任务crond
1.做备份
2.做巡检
3.日志切割
4.临时文件清理
5.定时向互联网同步时间

 

定时任务:crond
命令:crontab

 

定时任务的配置文件:

[root@uegame ~]# vim /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin    # 能直接加载的路径,和当前环境变量$PATH不一样(crontab命令尽量使用绝对路径)
MAILTO=root            # 默认root来创建, 会给root发邮件,命令后面跟 &>/dev/null 定向到黑洞就不会发邮件

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)    # 写00或0都可以
# |  .------------- hour (0 - 23)        # 写00或0都可以
# |  |  .---------- day of month (1 - 31)    # 如果为31,如这个月没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      命令

例:
* * * * * /bin/echo 1 >> /tmp/a.txt    # 每分钟执行一次    (>>写入定时任务的内容,而不是命令执行结果的内容)
59 * * * * /bin/echo 1 >> /tmp/a.txt    # 每个小时的第59分执行一次
59 00 * * * /bin/echo 1 >> /tmp/a.txt    # 每天凌晨12点59分执行一次
00  23  *  12  1 /bin/echo 1 >> /tmp/a.txt

定时任务内容格式

#每天的凌晨2点执行ls命令
00 02 * * * ls

#每月的1号的凌晨2点执行ls命令
00 02 1 * * ls

#每年的2月14日凌晨2点执行ls命令
00 02 14 2 * ls

#每周日的凌晨2点执行ls命令
00 02 * * 7 ls

#每年的6月份里面的每个周五凌晨2点执行ls命令
00 02 * 6 5 ls

#每个月的14号,但凡是一个周日,凌晨2点就执行ls
00 02 14 * 7 ls

#如果2月14号是周日就在凌晨的2点执行 ls命令
00 02 14 2 7 ls

#每天的凌晨2点,每隔10分钟执行一次ls命令(2点-3点之间,10分钟执行一次)
*/10  02 * * * ls

#每分钟执行一次ls命令     
* * * * *  ls

#每年的2月14日凌晨00点执行ls命令
00 00 14 2 *  ls

#每隔5分钟执行一次ls命令
*/5 * * * *  ls
*/5 * * * * /usr/sbin/ntpdate ntp.aliyun.com &>/dev/null

#每年的1月5月8月的每天的凌晨2点执行ls命令
00 02 * 1,5,8 * ls

#每月的1号到8号凌晨2点执行ls命令
00 02 1-8 * *  ls

#每天的21点执行ls命令
0 21 * * * ls

#每月的1号,10号,22号,的4点45分执行ls命令
45 4 1,10,22 * * ls

#每个月的1号到10号的4点45分执行ls命令   
45 4 1-10 * * ls

#每个月的每隔2天的8点03分,8点15分  9  10  11点 3分 15分
3,15 8-11 */2 * * ls

#每天7到23点每隔一小时执行一次ls
0 7-23/1 * * * ls

#每周一到周五的晚上21点15分执行ls命令
15 21 * * 1-5 ls      

 

定时任务命令

crontab:
    -l:查看定时任务 list
    -e:编辑定时任务    # 保存时会监测运行是否会有问题
    -u:指定用户    # crontab -e -u qiudao编辑qiudao下的定时任务    (可在/var/spool/cron/下查看)
            # 注意: 可以在/var/spool/cron/下用户文件中直接编辑任务,但保存不会监测运行是否有问题
    -r:删除所有定时任务    # crontab -u qiudao -r 删除qiuidao下所有定时任务

例: 添加和阿里同步时间的定时任务
crontab -e    # 编辑定时任务(命令上方加入注释和作者名,规范)
# 时间同步 By:ldc At:2023-06-03
*/5 * * * * /usr/sbin/ntpdate &>/dev/null

定时任务备份案例

1.每天的下午3,5点,每隔半小时执行一次sync命令
#每天的下午3,5点,每隔半小时执行一次sync命令 By:zls
*/30 15,17 * * * /usr/bin/sync &>/dev/null


2.每天凌晨3点做一次etc目录的备份,打包,备份到/backup目录下
需求:将备份命令写入一个脚本中

任务:
1.每天备份文件名要求格式:2018-02-20_hostname_etc.tar.gz
2.存放备份内容的目录要求只保留3天的数据
3.在执行计划任务时,不要输出任务信息

# 写脚本,通过定时任务执行脚本实现 vim backup_etc.sh
-----------------------------------------------------------
#!/bin/bash riqi=`date +%F` zhuji=`hostname` shijianchuo=`date +%F-%T` mkdir -p /backup # 记录日志, &&前面命令执行成功才会执行后面的命令 cd / && tar zcf /backup/${riqi}_${zhuji}_etc.tar.gz etc && echo "$shijianchuo 备份成功" >> /tmp/bak_result.txt find /backup -mtime +3 |xargs rm -f ------------------------------------------------------------
crontab
-e # 编辑定时任务 # 每天凌晨3点做一次etc目录的备份,打包,备份到/backup目录下 by ldc 00 03 * * * /bin/sh /root/backup_etc.sh &>/dev/null

crontab注意事项:

    1) 给定时任务注释
    2) 将需要定期执行的任务写入Shell脚本中,避免直接使用命令无法执行的情况tar date
    3) 定时任务的结尾一定要有&>/dev/null或者将结果追加重定向>>/tmp/date.log文件
    4) 注意有些命令是无法成功执行的 echo "123" >>/tmp/test.log &>/dev/null
    5)如果一定要是用命令,命令必须使用绝对路径

不允许特定用户添加定时任务(了解)

vim /etc/cron.deny
qiudao    # 写入用户名即可

 

计划任务如何调试

1.crond调试
    1) 调整任务每分钟执行的频率, 以便做后续的调试。
    2) 如果使用cron运行脚本,请将脚本执行的结果写入指定日志文件, 观察日志内容是否正常。
    3) 命令使用绝对路径, 防止无法找到命令导致定时任务执行产生故障。
    4) 通过查看/var/log/cron日志,以便检查我们执行的结果,方便进行调试。

2.crond编写思路

    1.手动执行命令,然后保留执行成功的结果。
    2.编写脚本
        脚本需要统一路径/scripts
        脚本内容复制执行成功的命令(减少每个环节出错几率)
        脚本内容尽可能的优化, 使用一些变量或使用简单的判断语句
        脚本执行的输出信息可以重定向至其他位置保留或写入/dev/null
    3.执行脚本
        使用bash命令执行, 防止脚本没有增加执行权限(/usr/bin/bash)    # 如果脚本有执行权限可直接执行,但不好管理
        执行脚本成功后,复制该执行的命令,以便写入cron
    4.编写计划任务
        加上必要的注释信息, 人、时间、任务
        设定计划任务执行的周期
        粘贴执行脚本的命令(不要手敲)
    5.调试计划任务
        增加任务频率测试
        检查环境变量问题
        检查crond服务日志 /var/log/cron

 

使用定时任务发邮件

# 安装发邮件
yum install -y mailx vim /etc/mail.rc # shift+g调到最下面进行编辑
--------------------------------------------
#发件人 set from=xxxxxxxxxx@qq.com #发件人用户名 set smtp-auth-user=xxxxxxxxxx@qq.com  # 与发件人相同 #发件人密码(QQ邮箱不可以使用密码,只能使用授权码) set smtp-auth-password=xxx #登录方式 set smtp-auth=login #邮件服务器协议及端口 set smtp=smtps://smtp.qq.com:465 #忽略证书 set ssl-verify=ignore #指定证书位置 set nss-config-dir=/root/.certs ---------------------------------------------
# 进qq邮箱,点击上方设置,点账户,点击开启POP3
/SMTP服务,获取授权码 # 配置邮件证书 # 创建邮件证书的目录 mkdir -p /root/.certs cd /root/.certs/ echo -n | openssl s_client -connect smtp.qq.com:465 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ~/.certs/qq.crt # 下面的命令一起执行 certutil -A -n "GeoTrust SSL CA" -t "C,," -d ~/.certs -i ~/.certs/qq.crt certutil -A -n "GeoTrust Global CA" -t "C,," -d ~/.certs -i ~/.certs/qq.crt certutil -L -d /root/.certs certutil -A -n "GeoTrust SSL CA -G3" -t "Pu,Pu,Pu" -d ~/.certs -i ~/.certs/qq.crt ---------------------------------------------
# 测试 cat /etc/passwd|mail -s 'passwd' xxxxxxxxxxx@163.com # -s 加上主题 --------------------------------------------

# 在/root/qingshu/路径下写多份文件

# 写定时任务脚本 vim send_qingshu.sh
---------------------------------------------
#!/bin/bash # 获取目录里第一个文件 qs_name=`ls -1 /root/qingshu/|head -1` shijianchuo=`date +%F-%T` # 发邮件 cat /root/qingshu/${qs_name} |mail -s '致XXX' xxxxxxxxxxx@163.com # 发送后删除这份邮件 if [$? -eq 0 ];then echo "$shijianchuo 邮件发送成功" >> /tmp/send_qingshu.txt rm -f /root/qingshu/$qs_name fi
-----------------------------------------------
# 编辑定时任务,执行发送邮件脚本