SRE笔记 2022.9.15&9.16
学习方法
- 学习很多知识,通过实践总结出步骤,并总结每个步骤的注意点,进行排错、扩展。
命令扩展
[root@aaa ~]# basename /root/scripts/tar.sh # 取路径最终的文件名
tar.sh
[root@aaa ~]# dirname /root/scripts/tar.sh # 取路径的前路径
/root/scripts
Linux系统定时任务
定时任务软件
at(不用)
- at定时任务软件(依赖于atd服务)适合仅执行一次就结束的调度任务工作。
anacron(几乎不用)
- 主要是为非7*24小时开机的服务器准备的,anacron并不能指定具体时间执行任务工作,而是以天为周期或者在系统每次开机后执行任务工作。它会监测服务器停机期间应该执行但是并没有执行的任务工作,并将该任务执行一遍
cron
- 定时任务软件依赖于crond服务
系统定时任务计划
[root@aaa ~]# ll /var/log/messages* #每周一次的系统日志
-rw-------. 1 root root 1184598 Sep 16 00:11 /var/log/messages
-rw-------. 1 root root 5534062 Aug 22 20:07 /var/log/messages-20220822
-rw-------. 1 root root 550004 Aug 28 03:27 /var/log/messages-20220828
-rw-------. 1 root root 1350157 Sep 5 06:35 /var/log/messages-20220905
-rw-------. 1 root root 823611 Sep 11 07:17 /var/log/messages-20220911
[root@aaa ~]# ll /var/log/secure* # 每周一次的安全日志
-rw-------. 1 root root 17502 Sep 15 23:55 /var/log/secure
-rw-------. 1 root root 50939 Aug 22 19:33 /var/log/secure-20220822
-rw-------. 1 root root 18425 Aug 26 23:33 /var/log/secure-20220828
-rw-------. 1 root root 21465 Sep 5 06:22 /var/log/secure-20220905
-rw-------. 1 root root 13057 Sep 9 22:13 /var/log/secure-20220911
系统定时任务配置文件
[root@aaa ~]# ll /etc/logrotate.conf /etc/cron.daily/logrotate
-rwx------. 1 root root 219 Apr 1 2020 /etc/cron.daily/logrotate
-rw-r--r--. 1 root root 662 Jul 31 2013 /etc/logrotate.conf
[root@aaa ~]# cat /etc/logrotate.conf
# see "man logrotate" for details
# rotate log files weekly
weekly
# keep 4 weeks worth of backlogs
rotate 4
# create new (empty) log files after rotating old ones
create
# use date as a suffix of the rotated file
dateext
# uncomment this if you want your log files compressed
#compress
# RPM packages drop log rotation information into this directory
include /etc/logrotate.d
# no packages own wtmp and btmp -- we'll rotate them here
/var/log/wtmp {
monthly
create 0664 root utmp
minsize 1M
rotate 1
}
/var/log/btmp {
missingok
monthly
create 0600 root utmp
rotate 1
}
# system-specific logs may be also be configured here.
定时任务语法
- 查看定时任务列表
[root@aaa ~]# crontab -l
no crontab for root
- 编辑定时任务
[root@aaa ~]# crontab -e
- 查看crontab文件:分 时 日 月 周
[root@aaa cron]# 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@aaa cron]# ll /var/spool/cron/ # 定时任务路径
total 0
- 定时任务在该目录下以用户名字命令的文件,文件里就是定时任务的指令
[root@aaa cron]# ll /etc/cron.deny # 该文件中的所列用户不允许使用crontab命令,不常用
-rw-------. 1 root root 0 Jan 14 2022 /etc/cron.deny
-
-减号 可做分隔符,表示时间段
-
,逗号可用作分割时段
-
每天的17-19点执行任务
* 17,18,19 * * *
- /n代表数字,每隔n单位时间,如每10分钟执行可表示为 */10 * * * *,因为*的范围是0~59
也可表示为0~59/10
服务依赖
[root@aaa cron]# systemctl status crond.service
* crond.service - Command Scheduler
Loaded: loaded (/usr/lib/systemd/system/crond.service; disabled; vendor preset: enabled)
Active: inactive (dead)
[root@aaa cron]# systemctl start crond.service
[root@aaa cron]# systemctl enable crond.service
Created symlink from /etc/systemd/system/multi-user.target.wants/crond.service to /usr/lib/systemd/system/crond.service.
注意事项
- 编辑定时任务完成后,无需重启定时任务,crond会自动检查更改的变化
- 当定时任务不能正确执行时,可查看定时任务日志文件(/var/log/cron)获取故障信息
- 0在周的位置上代表日。
实例和实践
- 每天的23点,0点-7点每隔1小时每分钟执行
* 23,00-07/1 * * *
``
- 向/data/hd/test.log中每分钟追加一个“i am learning 'date' ”
- 确定定时服务处在运行状态,进入编辑定时任务时要写注释,做什么,为谁做,谁做的,尽量用英文
```bash
[root@aaa ~]# crontab -l
# do what for whom who did at time
* * * * * echo "i am learning `date`" >> /data/hd/test.log
[root@aaa ~]# tail -f /data/hd/test.log
i am learing Sat Sep 17 00:18:51 CST 2022
i am learing Sat Sep 17 00:18:53 CST 2022
i am learing Sat Sep 17 00:18:53 CST 2022
i am learing Sat Sep 17 00:18:54 CST 2022
i am learning Sat Sep 17 00:24:02 CST 2022
i am learning Sat Sep 17 00:25:01 CST 2022
i am learning Sat Sep 17 00:26:01 CST 2022
i am learning Sat Sep 17 00:27:01 CST 2022
i am learning Sat Sep 17 00:28:01 CST 2022
ntpdate时间同步
[root@aaa ~]# ntpdate ntp5.aliyun.com
16 Sep 16:42:00 ntpdate[1744]: step time server 203.107.6.88 offset -28798.758883 sec
- 在时间同步完成后会有如上输出,所以在做定时任务时,一定要将其命令的正确和错误的输出都加入黑洞,避免产生过多小文件导致inode过多。
*/5 * * * * ntpdate ntp5.aliyun.com &>/dev/null 或者 >/dev/null 2>&1
文件定时备份
- 每天00点10分,备份/etc/rc.local,/var/splool/cron/root,/etc/hosts,使用2022-09-16时间格式作为压缩包名称的一部分,备份到/backup目录下。
- # 软链接文件,打包时主要加h
[root@aaa ~]# ll /etc | grep local
-rw-r--r--. 1 root root 19 Aug 14 18:13 locale.conf
lrwxrwxrwx. 1 root root 35 Aug 14 18:13 localtime -> ../usr/share/zoneinfo/Asia/Shanghai
lrwxrwxrwx. 1 root root 13 Aug 16 00:55 rc.local -> rc.d/rc.local # 软链接文件,打包时主要加h
- 定时任务执行的命令不能有%,如果用需要用\转义。因为定时任务不识别%。
- 定时任务尽量用脚本(命令放到文件里
- /bin/sh 脚本全路径
- 执行命令后加&>/dev/null 或者>/dev/null 2>1,避免产生过多小文件
[root@aaa ~]# tar zcfh /backup/conf_$(date + %F).tar.gz /etc/rc.local /var/spool/cron/root /etc/hosts
[root@aaa ~]# cat /root/scripts/tar.sh
/bin/tar zcfh /backup/conf_$(date + %F).tar.gz /etc/rc.local /var/spool/cron/root /etc/hosts
定时任务配置顺序
- 命令行输入命令:备份的路径要存在,软链接文件注意加h,打包要加时间和执行频率要匹配,命令要加全路径,路径也写明全路径,可以加输出测试
- 将命令写入脚本:脚本要放在规范的路径下如/scripts目录下,生产中的命令不要随意打印输出信息,时间变量%需要被转义,若脚本中调用了系统环境变量,需要重新定义,瑞软脚本执行能正常调用环境变量,但是定时任务不行,需要重新定义,因为定时任务执行的脚本属于非登录shell,所以脚本中使用的环境变量不能获取系统级别的环境变量。source在定时任务中执行也不行,都需要重新定义。
- 执行脚本测试:运行前可加可不加执行权。使用/bin/sh(无需给脚本赋执行权),脚本也要全路径。
- 编辑定时任务:加注释,尽量以脚本形式执行,在指定用户下执行相应的定时命令,
- 测试定时任务技巧:修改系统时间,增加定时任务调整执行频率,通过定时任务输出调试定时任务(重定向日志输出),通过/var/log/cron来调试任务
定时任务生产故障案例
- linux中开源的邮件软件从早起的qmail,到sendmail 再到postfix,自建相对复杂,建议购买企业邮箱
- no space left on device 案例
- 关于centos 5 执行ls /var/spool/clientmqueue 命令查看,长时间未显示结果,执行rm -rf 删除该目录文件,发现无法删除,需要执行ls | xargs rm -rf 可删除
- /var/spool/clientmqueue 目录是邮件系统存放临时右键的目录(c6之前)
- 对于c6,c7,是如下目录
[root@aaa ~]# cd /var/spool/postfix/maildrop/
- 大量的小文件就是邮件,inode满,block远大于inode
- 当邮件系统未开启时,同事定时任务不加隐藏输出的时候,定时任务的输出和报错会给root发邮件
- 如何防止大量小文件导致磁盘满的方法
- 尽量在定时任务后加&>/dev/null
- 关闭邮件服务(不建议使用,会代理额外的安全问题)
- 加定时清理任务,如清理30天以前的。
- 1个重启resin脚本,需要在某一时间重启resin服务器,手动执行正常,但定时任务不执行案例