常用小技能 获取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/user date "+%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