Shell实战
常用小技能
获取tomcat pid
第一个查tomcat, 第二个管道 -v是排除 grep的结果,第三个就是按照空格切割,取第二个内容 (pid)
|
判断某文件夹 或者某文件是否存在
https://www.cnblogs.com/emanlee/p/3583769.html
|
数据邮件发出
功能描述:
1)定期查询数据特定文件,执行特定sql
2)生成excel文件,文件名后缀跟时间戳
3)邮件发送出来
功能点:
- 定时任务
- 邮件功能
- 按日期生产excel文件
- 数据库查询结果导出
生成特定命名的excel文件
user`date “+%Y-%m-%d%H%M”.xls
生成的xls文件保存在对应路径下面
/usr/huang/export_files/user_
date “+%Y-%m-%d_%H%M”`.xls
mysql -uroot -p123456 -P3306 –default-character-set=gbk eedu -e”select u.mobile,u.name,h.name hospital,d.name department,h.ucmid,u.create_date from user u left join hospital h on u.hospital_id = h.id left join department d on u.department_id = d.id;” > /usr/huang/exportfiles/userdate "+%Y-%m-%d_%H%M"
.xls
发送邮件
mail -s test_info -A /usr/huang/export_files/${file_name} 570247284@qq.com
|
哈哈哈,试验成功了,每2分钟发送一份user表中的内容到我的QQ邮箱当中
|
定时任务的坑
1) crontab 里面的路径一定要用 绝对路径,比如 /usr/bin/mysql 而不是mysql
2) crontab 里面引用的变量一定要 export
3) 输出文件比如日志文件 一定要有相应的读写权限啊 777
4) 定时任务执行的脚本也要有777权限啊,除非是用root用户创建的定时任务脚本
5) 定时任务要执行sql,且sql里面有中文的话一定要设置字符集 否则会乱码报错的,但是直接执行则不会
字符集bug演示,如果不设置字符集,sql中有中文就报错
|
|
数据库定时任务备份实战
功能描述:
- 定时任务 每小时定时备份一份数据库脚本文件
- 并且压缩成tar文件
|
定时监控CPU、内存性能输出到按照日期戳的日志文本中
Centos 6.2 上 利用 sar 命令,利用定时任务,每分钟刷一次,每次取10秒内的平均 cpu 和内存多大使用情况,并追加输入到 按日期标注的日志文本当中。
相比top 命令,这个对系统消耗的资源更低,每次top输出的cpu use都75%,不知道什么原因。
/1 * /usr/developer/back/static.sh
|
输出结果
|
磁盘分区和分析
1.文件路径只有挂在到了对应的磁盘下面,并且有空间才能使用空间。
比如500G硬盘的服务器,只分配了100G 到sda 硬盘上,而根目录挂在在 sda 硬盘上,则最多支持100G的存储。
扩展存储就需要额外分区,类似windows安装的分区,C区100G, D区100G,E区300G,则D区只能最多存放100G的文件
但是linux的磁盘结构可以选择 LVM,逻辑分区,就可以解决这个问题, 300G的空间为LVM,则可以分组存放东西,而且 LVM_root 和LVM_home调整大小的时候不需要格式化,非常容易扩展。
df -h 查看各个分区的使用情况。
下面看到根目录下使用率32%,其他分区使用率更低,算是安全健康的
|
fdisk -l
查看磁盘分配情况: 下面可以看出来 ,一共有2个硬盘, sda硬盘(107.4G) 和 sdb硬盘(429.5G)
其中sda硬盘分为2个区,sda1区,为 boot区,分配512M来负责程序启动,sda2区104G,用作LVM,供逻辑分区使用。 sda磁盘一共13054个磁柱,已经全部被使用完了。所以sda磁盘不可再分配了。
sdb磁盘 429.5g,其中分配了209G出来,作为LVM,磁盘 还剩下52216-26108=26108个磁柱,也就是209G的空余空间待分配。
所以LVM的总量为 104G+209G=313G的逻辑空间,然后基于这个空间划分为3个lv组: VolGroup-lv_root: 268.4 GB,VolGroup-lv_swap: 4227 MB,VolGroup-lv_home: 48.9 GB,
root 挂在根节点,home挂在 home路径,swap挂在交换区。
|
mailx 定期发送网站运营数据
需求:每天、每周一、每月1号发送相关的网站运营数据。
59 2 /root/eedu-shell/rmtxt.sh
0 3 /root/eedu-shell/statistics.sh /root/eedu-shell/query.sql /root/eedu-shell/insert.sql
1 3 1 /root/eedu-shell/statistics.sh /root/eedu-shell/query-week.sql
2 3 1 /root/eedu-shell/statistics.sh /root/eedu-shell/query-month.sql
3 3 * /root/eedu-shell/sendmail.sh
第一个(清空之前的查询结果):每天2:59 执行
第二个(每天统计):每天3点执行
第三个(每周统计):每周一的晚上3:01分执行
第四个(每月统计):每个月的1号 晚上3:02分执行
第五个(每天邮件发送查询结果):每天3:03分执行
rmtxt.sh(清空之前的查询结果)
|
statistics.sh
/root/eedu-shell/statistics.sh /root/eedu-shell/query.sql /root/eedu-shell/insert.sql
- 该脚本接收多个sql脚本参数,for循环遍历sql文件路径参数,命名为变量 sqlFile、、
- sqlFile作为路径输入到 while循环当中,赋值为变量sql,里面由很多行sql,然后挨个执行
- 输出执行结果追加到sqlResultPath 路径当中
#!/bin/bash
export LANG=en_US.UTF-8
username=root
password=dh@ge
sqlResultPath=/root/eedu-shell/txt/queryResult.txt
# $* 表示所有的参数 ,遍历参数
for sqlFile in $*
do
#while read 一次性获取 参数当中的所有sql 赋值到sql当中,然后遍历每一行的sql语句,引入的参数就是 $sqlFile
while read sql
do
/usr/bin/mysql -u$username -p$password -e "$sql" eedu >> $sqlResultPath
done < $sqlFile
done