shell每日一炮

1、nginx log备份

mkdir -pv /data/logbak/$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%Y%m")/$(date -d "yesterday"
 +"%m%d")
cd /data/logbak
cp -r /data/logs/* /data/logbak/$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%Y%m")/$(date -d
 "yesterday" +"%m%d")/
cp /usr/local/nginx/logs/error.log  /data/logbak/$(date -d "yesterday" +"%Y")/$(date -d "yesterday" 
+"%Y%m")/$(date -d "yesterday" +"%m%d")/
cd /data/logs/
rm -rf *
rm -rf /usr/local/nginx/logs/error.log
nginx -s reload

2、mongodb备份

#!/bin/bash
dump=/usr/bin/mongodump
temporary=/data/mongobak
date=`date +%Y-%m-%d`
db_user=name
db_pwd=pwd
days=7
cd $temporary
mkdir -p  $temporary/$date
$dump  -h127.0.0.1 -u $db_user -p $db_pwd -o $temporary/$date
#tar -zcvf $now/mongod_bak_$date.tar.gz $temporary/$date
#find $temporary/ mtime +$days -delete

exit 

3、每日生成一个文件

请按照这样的日期格式(xxxx-xx-xx)每日生成一个文件,例如今天生成的文件为)2017-07-05.log, 并且把磁盘的使用情况写到到这个文件中,(不用考虑cron,仅仅写脚本即可)

#! /bin/bash
d=`date +$F`         //获取今天日期定义为d
logfile= $d.log      //d+.log定义为logfile
df -h >$logfile      //磁盘使用情况追加到logfile

###shell下获取系统时间的方法直接调用系统变量

##获取今天时期
[root@jiangshan shell]# `date +%Y%m%d` 
[root@jiangshan shell]# `date +%F` 
[root@jiangshan shell]# $(date +%y%m%d) 

[root@jiangshan shell]# `date -d yesterday +%Y%m%d`  //获取昨天时期
[root@jiangshan shell]# `date -d -2day +%Y%m%d`      //获取前天日期

## 依次类推比如获取10天前的日期:
[root@jiangshan shell]# `date -d -10day +%Y%m%d`     
[root@jiangshan shell]# `date -d "n days ago" +%y%m%d`   //或n天前的
[root@jiangshan shell]# `date -d tomorrow +%y%m%d`     //明天
注意以上中间有空格

shell获取时间函数和date用法参数

4、统计日志

有日志1.log,内容如下:

###日志片段:
112.111.12.248 – [25/Sep/2013:16:08:31 +0800]formula-x.haotui.com
“/seccode.php?update=0.5593110133088248″
200″http://formula-x.haotui.com/registerbbs.php” “Mozilla/4.0 (compatible; MSIE
6.0; Windows NT 5.1; SV1;)”
61.147.76.51 – [25/Sep/2013:16:08:31 +0800]xyzdiy.5d6d.com
“/attachment.php?aid=4554&k=9ce51e2c376bc861603c7689d97c04a1&t=1334564048&fid=9&si
d=zgohwYoLZq2qPW233ZIRsJiUeu22XqE8f49jY9mouRSoE71″
301″http://xyzdiy.5d6d.com/thread-1435-1-23.html” “Mozilla/4.0 (compatible; MSIE
6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)”

要求: 统计出每个IP的访问量有多少?

awk '{print $1}' 1.log |sort -n|uniq -c

5、进程占用内存大小

需求:写一个脚本计算一下linux系统所有进程占用内存大小的和。(提示,使用ps或者top命令)

  • 方法一
#! /bin/bash
sum=0             //定义总数为0
for mum in   ` ps aux    | awk '{print $6}'| grep -v 'RSS'`
//for循环    查看进程      获取第6行         除去RSS   
do
sum=$[$sum+$mum]     //相加总和
done
echo "the total memory is $sum""K"   //输出
  • 方法二
ps aux |grep 'RSS TTS'|awk '{(sum=sum+$6)};END{print $sum}'

6、设计监控脚本

设计一个脚本,监控远程的一台机器(假设ip为123.23.11.21)的存活状态,当发现宕机时发一封邮件给你自己。

提示:

你可以使用ping命令 ping -c10 123.23.11.21 发邮件脚本可以参考 https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D22Z/mail.py 脚本可以搞成死循环,每隔30s检测一次

#!/bin/bash

ip=123.23.11.21
ma=abc@139.com

while 1

do
ping -c10 $ip >/dev/null 2>/dev/null
if [ $? != “0” ];then
python /usr/local/sbin/mail.py $ma “$ip down” “$ip is down”

#假设mail.py已经编写并设置好了
fi
sleep 30
done

7、批量更改文件名

  1. 这里是列表文本
  2. 找到/123目录下所有后缀名为.txt的文件
  3. 批量修改.txt为.txt.bak
  4. 把所有.bak文件打包压缩为123.tar.gz
  5. 批量还原文件的名字,即把增加的.bak再删除
#!/bin/bash
##查找txt文件
find /123 -type f -name "*.txt" > /tmp/txt.list
##批量修改文件名
for f in `cat /tmp/txt.list`
do
    mv $f $f.bak
done
##创建一个目录,为了避免目录已经存在,所以要加一个复杂的后缀名
d=`date +%y%m%d%H%M%S`
mkdir /tmp/123_$d
##把.bak文件拷贝到/tmp/123_$d
for f in `cat /tmp/txt.list`
do
    cp $f.bak /tmp/123_$d
done
##打包压缩
cd /tmp/
tar czf 123.tar.gz 123_$d/
##还原
for f in `cat /tmp/txt.list`
do
    mv $f.bak $f
done

8、监控80端口

写一个脚本,判断本机的80端口是否开启着,如果开启着什么都不做,如果发现端口不存在,那么重启一下httpd服务,并发邮件通知你自己。脚本写好后,可以每一分钟执行一次,也可以写一个死循环的脚本,30s检测一次。

#! /bin/bash
mail=123@123.com
if netstat -lnp |grep ':80' |grep -q 'LISTEN'; then
    exit
else
    /usr/local/apache2/bin/apachectl restart >/dev/null 2> /dev/null
    python mail.py $mail "check_80" "The 80 port is down."
    n=`ps aux |grep httpd|grep -cv grep`
    if [ $n -eq 0 ]; then
        /usr/local/apache2/bin/apachectl start 2>/tmp/apache_start.err
    fi
    if [ -s /tmp/apache_start.err ]; then
        python mail.py  $mail  'apache_start_error'   `cat /tmp/apache_start.err`
    fi
fi

9、域名代理

内网有一台机器不能连外网,所以没有办法使用yum,考虑过使用iptables nat 转发上网,但因为一些原因,放弃使用。所以想到nginx代理,原理很简单。 A 不能访问 1网站, B可以访问,A和B可以内网通信,所以可以让B作为A的代理。 并且可以限定访问的来源IP,配置文件如下:

server {
    listen       80;
    server_name aaa.com bbb.com  ccc.com ddd.com eee.com;

    location / {
        resolver 119.29.29.29;
        proxy_pass       http://$host;
        proxy_set_header Host      $host;
        proxy_set_header X-Real-IP $remote_addr;
        allow 192.168.5.0/24;
        deny all;
    }
}

说明:这里的119.29.29.29 为一个DNS的ip,用resolver来指定。 假如B机器内网ip为 192.168.5.11,只需要在A上加一条hosts 192.168.5.11 aaa.com bbb.com ccc.com ddd.com eee.com

10、备份数据库

设计一个shell脚本来备份数据库,首先在本地服务器上保存一份数据,然后再远程拷贝一份,本地保存一周的数据,远程保存一个月。 假定,我们知道mysql root账号的密码,要备份的库为discuz,本地备份目录为/bak/mysql, 远程服务器ip为192.168.123.30,远程提供了一个rsync服务,备份的地址是 192.168.123.30::backup . 写完脚本后,需要加入到cron中,每天凌晨3点执行。

#! /bin/bash
### backup mysql data
### Writen by Aming.

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/mysql/bin
d1=`date +%w`
d2=`date +%d`
pass="your_mysql_password"
bakdir=/bak/mysql
r_bakdir=192.168.123.30::backup

exec 1>/var/log/mysqlbak.log 2>/var/log/mysqlbak.log

echo "mysql backup begin at `date +"%F %T"`."
mysqldump -uroot -p$pass --default-character-set=gbk discuz >$bakdir/$d1.sql
rsync -az $bakdir/$d1.sql $r_bakdir/$d2.sql
echo "mysql backup end at `date +"%F %T"`."

然后加入cron
0 3 * * * /bin/bash /usr/local/sbin/mysqlbak.sh

11、截取系统一分钟负载部分只取整数部分

uptime|awk -F 'load average:' '{print $2}'|cut -d. -f1|sed 's/ //'

转载于:https://my.oschina.net/jiangshanlinux/blog/1505796

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值