Contents
  1. 1. 常用小技能
    1. 1.1. 获取tomcat pid
    2. 1.2. 判断某文件夹 或者某文件是否存在
  2. 2. 数据邮件发出
    1. 2.1. 生成特定命名的excel文件
    2. 2.2. 发送邮件
  3. 3. 定时任务的坑
  4. 4. 数据库定时任务备份实战
  5. 5. 定时监控CPU、内存性能输出到按照日期戳的日志文本中
  6. 6. 磁盘分区和分析
    1. 6.1. df -h 查看各个分区的使用情况。
    2. 6.2. fdisk -l
  7. 7. mailx 定期发送网站运营数据
    1. 7.1. rmtxt.sh(清空之前的查询结果)
    2. 7.2. statistics.sh

常用小技能

获取tomcat pid

第一个查tomcat, 第二个管道 -v是排除 grep的结果,第三个就是按照空格切割,取第二个内容 (pid)

ps -ef | grep tomcat | grep -v grep | awk '{print $2}'

判断某文件夹 或者某文件是否存在

https://www.cnblogs.com/emanlee/p/3583769.html

target_dir="/home/huang/test1840/test_child"
if [ ! -d $target_dir ];then
mkdir -p $target_dir
fi
file_name=/home/huang/test1234.txt
if [ ! -f $file_name ];then
touch $file_name
fi

数据邮件发出

功能描述:
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

#/bin/bash
# send user information by mail
file_name=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/export_files/$file_name
mail -s test_info -A /usr/huang/export_files/${file_name} 570247284@qq.com </usr/huang/export_files/mail.txt
echo "it's done"

哈哈哈,试验成功了,每2分钟发送一份user表中的内容到我的QQ邮箱当中

root@huang-virtual-machine:/usr/huang/export_files# crontab -l
*/2 * * * * /usr/huang/export_files/sendMail.sh

定时任务的坑

1) crontab 里面的路径一定要用 绝对路径,比如 /usr/bin/mysql 而不是mysql
2) crontab 里面引用的变量一定要 export
3) 输出文件比如日志文件 一定要有相应的读写权限啊 777
4) 定时任务执行的脚本也要有777权限啊,除非是用root用户创建的定时任务脚本
5) 定时任务要执行sql,且sql里面有中文的话一定要设置字符集 否则会乱码报错的,但是直接执行则不会

字符集bug演示,如果不设置字符集,sql中有中文就报错

#!/bin/bash
export LANG=en_US.UTF-8
/usr/bin/mysql -uroot -pdh@ge eedu </root/eedu-shell/insert.sql >>/root/eedu-shell/sql.log 2>&1

#!/bin/bash
time=mytime_`date +%Y-%m-%d_%H%M`
# test.txt 必须是777权限,而且这个是绝对路径啊
echo $time >> /home/huang/test/test.txt

数据库定时任务备份实战

功能描述:

  • 定时任务 每小时定时备份一份数据库脚本文件
  • 并且压缩成tar文件
#!/bin/bash
#backup eedu database test
file_name=eedubackup_`date "+%Y-%m-%d_%H%M"`.sql
base_dir=/home/huang/eedubackup
if [ ! -d $base_dir ];then
mkdir -p $base_dir
fi
mysqldump -u root -p123456 eedu > ${base_dir}/$file_name
cd $base_dir
tar -zcvpf $file_name.tar.gz $file_name
rm -f $file_name

定时监控CPU、内存性能输出到按照日期戳的日志文本中

Centos 6.2 上 利用 sar 命令,利用定时任务,每分钟刷一次,每次取10秒内的平均 cpu 和内存多大使用情况,并追加输入到 按日期标注的日志文本当中。
相比top 命令,这个对系统消耗的资源更低,每次top输出的cpu use都75%,不知道什么原因。

/1 * /usr/developer/back/static.sh

#!/bin/bash
# 每监控一次,每次监控10秒内的cpu的使用情况,并且按照日期的格式追加到文本log日志当中。
sar -u 10 1 | sed -n '4p' >>/usr/developer/backup_huang/cpu_log_`date +"%Y-%m-%d"`.txt
sar -r 10 1 | sed -n '4p' >>/usr/developer/backup_huang/memory_log_`date +"%Y-%m-%d"`.txt

输出结果

cpu
16:06:01 CPU %user %nice %system %iowait %steal %idle
16:07:11 all 1.10 0.00 0.75 0.02 0.00 98.13
memory
16:06:11 kbmemfree kbmemused %memused kbbuffers kbcached kbcommit %commit
16:06:21 335500 15999188 97.95 538060 8058984 8581844 41.94
Average: 335500 15999188 97.95 538060 8058984 8581844 41.94
16:07:21 337064 15997624 97.94 538064 8059824 8581036 41.93
16:08:21 335028 15999660 97.95 538064 8061680 8580932 41.93
16:09:21 334424 16000264 97.95 538064 8062700 8580036 41.93

磁盘分区和分析

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%,其他分区使用率更低,算是安全健康的

[root@localhost /]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root 247G 74G 161G 32% /
tmpfs 7.8G 88K 7.8G 1% /dev/shm
/dev/sda1 485M 33M 428M 8% /boot
/dev/mapper/VolGroup-lv_home 45G 1.3G 42G 3% /home

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挂在交换区。

[root@localhost /]# fdisk -l
Disk /dev/sda: 107.4 GB, 107374182400 bytes
255 heads, 63 sectors/track, 13054 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00013367
Device Boot Start End Blocks Id System
/dev/sda1 * 1 64 512000 83 Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2 64 13055 104344576 8e Linux LVM
Disk /dev/sdb: 429.5 GB, 429496729600 bytes
255 heads, 63 sectors/track, 52216 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0bfa5bdc
Device Boot Start End Blocks Id System
/dev/sdb1 1 26109 209720511 8e Linux LVM
Disk /dev/mapper/VolGroup-lv_root: 268.4 GB, 268439650304 bytes
255 heads, 63 sectors/track, 32635 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
Disk /dev/mapper/VolGroup-lv_root doesn't contain a valid partition table
Disk /dev/mapper/VolGroup-lv_swap: 4227 MB, 4227858432 bytes
255 heads, 63 sectors/track, 514 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
Disk /dev/mapper/VolGroup-lv_swap doesn't contain a valid partition table
Disk /dev/mapper/VolGroup-lv_home: 48.9 GB, 48930750464 bytes
255 heads, 63 sectors/track, 5948 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
Disk /dev/mapper/VolGroup-lv_home doesn't contain a valid partition table

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(清空之前的查询结果)

#!/bin/bash
txtDir=/root/eedu-shell/txt
rm -f $txtDir/*.txt

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
Contents
  1. 1. 常用小技能
    1. 1.1. 获取tomcat pid
    2. 1.2. 判断某文件夹 或者某文件是否存在
  2. 2. 数据邮件发出
    1. 2.1. 生成特定命名的excel文件
    2. 2.2. 发送邮件
  3. 3. 定时任务的坑
  4. 4. 数据库定时任务备份实战
  5. 5. 定时监控CPU、内存性能输出到按照日期戳的日志文本中
  6. 6. 磁盘分区和分析
    1. 6.1. df -h 查看各个分区的使用情况。
    2. 6.2. fdisk -l
  7. 7. mailx 定期发送网站运营数据
    1. 7.1. rmtxt.sh(清空之前的查询结果)
    2. 7.2. statistics.sh