常见脚本20例

1、【案例要求】

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

【案例答案】

#! /bin/bash
d=`date +%F`
logfile=$d.log
df -h > $logfile

需求升级:
#!/bin/bash
d=`date +%F`
dir=/data/logs/disklog
if [ ! -d $dir ]
then
mkdir -p $dir
fi
df -h > $dir/$d.log
find $dir/ -mtime +365 -exec rm -rf {} \;

2、【案例要求】

日志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&sid=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 |uniq -c |sort -n -r

3、【案例要求】

写一个脚本计算一下linux系统所有进程占用内存大小的和。

【案例答案】

#!/bin/bash
sum=0
for n in `ps aux |grep -v 'TIME COMMAND'|awk '{print $6}'`
do
sum=$[$sum+$n]
done
echo $sum

4、【案例要求】

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

ping -c10 177.163.25.38 通过ping来判定对方是否在线

发邮件脚本 https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D22Z/mail.py

【案例答案】

#!/bin/bash
n=`ping -c5 180.163.26.39|grep 'packet' |awk -F '%' '{print $1}' |awk '{print $NF}'`
if [ -z "$n" ]
then
echo "脚本有问题。"
python mail.py $m "检测机器存活脚本$0有问题" "获取变量的值为空"
exit
else
n1=`echo $n|sed 's/[0-9]//g'`
if [ -n "$n" ]
then
echo "脚本有问题。"
python mail.py $m "检测机器存活脚本$0有问题" "获取变量的值不是纯数字"
exit 
fi
fi

if 
m=123@qq.com
while :
do
if [ $n -ge 50 ]
then
python mail.py $m "机器宕机" "丢包率是$n%"
fi
sleep 30
done

5、【案例要求】

找到/123目录下所有后缀名为.txt的文件
1. 批量修改.txt为.txt.bak
2. 把所有.bak文件打包压缩为123.tar.gz
3. 批量还原文件的名字,即把增加的.bak再删除

【案例答案】

#!/bin/bash
find /123/ -type f -name "*.txt" > /tmp/txt.list 
for f in `cat /tmp/txt.list`
do
mv $f $f.bak
done

for f in `cat /tmp/txt.list`
do
echo $f.bak
done > /tmp/txt.bak.list

tar -czvf 123.tar.gz `cat /tmp/txt.bak.list |xargs `

for f in `cat /tmp/txt.list`
do 
mv $f.bak $f
done

6、【案例要求】

把一个文本文档的前5行中包含字母的行删除掉,
同时把6到10行中的全部字母删除掉。

【案例答案】

sed -n '1,5'p $1 |sed '/[a-zA-Z]/d'
sed '1,5d' $1 |sed '1,5s/[a-zA-Z]//g'

7、【案例要求】

用shell脚本实现如下需求:

添加user_00 – user_09 10个用户,
并且给他们设置一个随机密码,
密码要求10位包含大小写字母以及数字,
注意需要把每个用户的密码记录到一个日志文件里。
 【案例答案】

#!/bin/bash
for i in `seq -w 00 09`
do
useradd user_$i
p=`mkpasswd -l 10 -s 0 `
echo "user_$i $p" >> /tmp/pass.tmp
echo $p |passwd --stdin user_$i //给用户指定密码
done

8、【案例要求】

写个shell,看看你的Linux系统中是否有自定义用户(普通用户),
若是有,一共有几个?

【案例答案】

#!/bin/bash
v=`awk -F 'release ' '{print $2}' /etc/redhat-release |cut -d '.' -f1`
user()
{
if [ $1 -eq 0 ]
then
echo "系统没有自定义的用户"
else
echo "系统存在自定义用户,有$1个"
fi
}
case $v in 
5|6)
n=`awk -F ':' '$3>=500' /etc/passwd|wc -l`
user $n
;;
7)
n=`awk -F ':' '$3>=1000' /etc/passwd|wc -l`
user $n
;;
*)
echo "脚本出错."
;;
esac

9、【案例要求】

有一台服务器作为web应用,有一个目录(/data/web/)
不定时地会被用户上传新的文件,但是不知道什么时候会上传。
所以,需要我们每5分钟做一次检测是否有新文件生成。

请写一个shell脚本去完成检测。检测完成后若是有新文件,
还需要将新文件的列表输出到一个
按年、月、日、时、分为名字的日志里。

【案例答案】

#!/bin/bash
basedir=/data/web/attachment
t=`date +%Y%m%d%H%M`

find $basedir/ -type f -mmin -5 > /tmp/file.list
n=`wc -l /tmp/file.list|awk '{print $1}'`
if [ $n -lt 0 ]
then
mv /tmp/file.list /tmp/$t.list
fi

10、【案例要求】

每天的0点和12点时,需要将目录/data/log/下的文件全部清空,

但是只能清空文件内容而不能删除文件。
而其他时间只需要统计一下每个文件的大小,
一个文件一行,输出到一个按日期和时间为名字的日志里。

【案例答案】

#!/bin/bash
dir=/tmp/log_stat
t=`date +%d%H`
t1=`date +%H`
logdir=/data/log

[ -d $dir ] || mkdir $dir
[ -f $dir/$t.log ] && rm -f $dir/$t.log

if [ $t == "00" -o $t == "12" ]
then
for f in `find $logdir/ -type f`
do
> $f
done
else
for f in `find $logdir/ -type f`
do
du -sh $f >> $dir/$t.log
done
fi

11、【案例要求】

计算文档abc.txt中每一行中出现的数字个数并且要计算一下
整个文档中一共出现了几个数字。例如a.txt内容如下:
12aa*lkjdsfdgdj
alskdflasfdasdfjflkjj
我们脚本名字为 ncount.sh, 运行它时:
bash ncount.sh abc.txt
输出结果应该为:
2
0
sum:2

【案例答案】

#!/bin/bash
sum=0
while read line
do
line_n=`echo $line|sed 's/[^0-9]//g'|wc -L`
echo $line_n
sum=$[$sum+$line_n]
done < $1
echo "sum:$sum"

12、【案例要求】

一台机器负载高,top查看有很多sh的进程,
然后top -c查看可以看到对应的进程命令是sh -c /bin/clearnen.sh 。

写一个脚本批量杀死所有sh的进程。

【案例答案】

#!/bin/bash
for pid in `ps aux |grep clearnen.sh |awk '{print $2}'` 
do 
echo $pid
kill -9 $pid
done

13、【案例要求】

写一个脚本判断你的Linux服务器里是否开启web服务?
(监听80端口)如果开启了,请判断出跑的是什么服务,
是httpd呢还是nginx又或者是tomcat或其他的什么?

【案例答案】

#!/bin/bash
n=`netstat -lntp |grep ':80 '|wc -l`
if [ $n -eq 0 ]
then
echo "It not listen port 80"
else
ser=`netstat -lntp |grep ':80 '|awk -F '/' 
'{print $NF}'|sed 's/ //g'`
echo "It is listenning port 80, and the service is $ser."
fi

14、【案例要求】

写一个脚本: 计算100以内所有能被3整除的正整数的和

【案例答案】

#!/bin/bash
sum=0
for i in `seq 1 100`
do
j=$[$i%3]
if [ $j -eq 0 ]
then
sum=$[$sum+$i]
fi
done
echo $sum

15、【案例要求】

假设,当前MySQL服务的root密码为123456,写脚本检测MySQL服务是否正常(比如,可以正常进入mysql执行show processlist),

并检测一下当前的MySQL服务是主还是从,如果是从,请判断它的主从服务是否异常。如果是主,则不需要做什么。

【案例答案】

#!/bin/bash
mysql="/usr/local/mysql/bin/mysql -uroot -p123456"
if ! $mysql -e "show processlist" >/dev/null 2>/dev/null 
then
echo "MySQL service is down."
exit
else
$mysql -e "show slave status\G" 2>/dev/null >/tmp/slave.stat
n=`wc -l /tmp/slave.stat|awk '{print $1}'`
if [ $n -eq 0 ]
then
echo "This is master."
else
echo "This is slave."
egrep 'Slave_IO_Running:|Slave_SQL_Running:'/tmp/slave.stat|awk -F ': ' '{print $2}' > /tmp/SQL.tmp
if grep -qw "No" /tmp/SQL.tmp 
then
echo "The slave is down."
fi
fi
fi

16、【案例要求】

写一个脚本,检测你的网络流量,并记录到一个日志里。需要按照如下格式,并且一分钟统计一次(只需要统计外网网卡,假设网卡名字为eth0):
2017-08-04 01:11
eth0 input: 1000bps
eth0 output : 200000bps
#### ############
2017-08-04 01:12
eth0 input: 1000bps
eth0 output : 200000bps
 
提示:使用sar -n DEV  1 59 这样可以统计一分钟的平均网卡流量,只需要最后面的平均值。另外,注意换算一下,1Byte=8bit

【案例答案】

#!/bin/bash
logdir=/tmp/sar_log
file=$logdir/`date +%d%H`.log
t=`date +"%F %H:%M"`

[ -d $logdir ] || mkdir -p $logdir
LANG=en
sar -n DEV 1 5 |grep eth0 |grep "Average" > /tmp/sar.tmp

exec >>$file
echo "$t" 
awk '{print "eth0 input:",$5*8000"bps""\n""eth0 output:",$6*8000"bps"}' /tmp/sar.tmp 
echo "#### ###################"

17、【案例要求】

写一个shell脚本,检测所有磁盘分区使用率和inode使用率
并记录到以当天日期为命名的日志文件里,
当发现某个分区容量或者inode使用量大于85%时,发邮件通知你自己。

【案例答案】

写一个shell脚本,检测所有磁盘分区使用率和inode使用率
并记录到以当天日期为命名的日志文件里,
当发现某个分区容量或者inode使用量大于85%时,发邮件通知你自己。


#### 参考答案
```
#!/bin/bash
dir=/tmp/disk
d=`date +%F`
mail=123@123.com

[ -d $dir ] || mkdir $dir

df >> $dir/$d.log
df -i >> $dir/$d.log

df|sed '1d' |awk -F ' +|%' '$5>=85 {print $7}' > $dir/df.tmp
df -i|sed '1d' |awk -F ' +|%' '$5>=85 {print $7}' > $dir/df_i.tmp

n1=`wc -l $dir/df.tmp|awk '{print $1}'`
n2=`wc -l $dir/df_i.tmp|awk '{print $1}'`

tag=0
if [ $n1 -gt 0 ]
then
    if [ $n2 -gt 0 ]
    then
    tag=11
    else
    tag=10
    fi
else
    if [ $n2 -gt 0 ]
    then
    tag=01
    else
    tag=00
    fi
fi

case $tag in
    11)
    python mail.py $mail "磁盘空间和inode使用率高于85%" "`cat $dir/df.tmp $dir/df_i.tmp|xargs`"
        ;;
    10)
    python mail.py $mail "磁盘空间使用率高于85%" "`cat $dir/df.tmp|xargs`"
    ;;
    01)
    python mail.py $mail "磁盘inode使用率高于85%" "`cat $dir/df_i.tmp|xargs`"
    ;;
    *)
    ;;
esac

//这里发邮件也可以用以下这种方法:

 

 18、【案例要求】

服务器上跑的是LNMP环境,近期总是有502现象。502为网站访问的状态码,200正常,502错误是nginx最为普遍的错误状态码。

由于502只是暂时的,并且只要一重启php-fpm服务则502消失,但不重启的话,则会一直持续很长时间。

所以有必要写一个监控脚本,监控访问日志的状态码,一旦发生502,则自动重启一下php-fpm。

我们设定:

1)access_log  /data/log/access.log

2)脚本死循环,每10s检测一次(假设每10s钟的日志条数为300左右)

3)重启php-fpm的方法是  /etc/init.d/php-fpm restart

【案例答案】

#!/bin/bash
log=/data/log/access.log
while :
do
502_n=`tail -n 300 $log |grep -c ' 502 '`
if [ -z "$502_n" ]
then
exit
fi

if [ $502_n -gt 100 ]
then
/etc/init.d/php-fpm restart >/dev/null 2>/tmp/php-fpm.err
fpm_p_n=`pgrep -l php-fpm|wc -l`
if [ $fpm_p_n -eq 0 ]
then
python mail.py xxx@xx.com "php-fpm重启失败" "`head -1 /tmp/php-fpm.err`"
exit
fi
fi
sleep 10
done

19、【案例要求】

设计一个shell脚本来备份数据库,首先在本地服务器上保存一份数据,然后再远程拷贝一份,本地保存一周的数据,远程保存一个月。

假定,我们知道mysql root账号的密码,要备份的库为discuz,本地备份目录为/bak/mysql, 远程服务器ip为192.168.123.30,
远程提供了一个rsync服务,备份的地址是 192.168.123.30::backup  . 写完脚本后,需要加入到cron中,每天凌晨3点执行。

【案例答案】

#!/bin/bash
d1=`date +%w`
d2=`date +%d`
local_bakdir=/bak/mysql
remote_bakdir=192.168.123.30::backup

exec 1> /tmp/mysqlbak.log 2>/tmp/mysqlbak.err
echo "mysql bakcup begin at `date`"
mysqldump -uroot -pxxxx discz > $local_bakdir/discuz.sql.$d1
rsync -az $local_bakdir/discuz.sql.$d1 $remote_bakdir/discuz.sql.$d2
echo "mysql backup end at `date`"

20、【案例要求】

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

【案例答案】

#!/bin/bash
m=123@123.com
while :
do
n=`netstat -lntp |grep ':80 '|wc -l`
if [ $n -eq 0 ]
then
/usr/local/apache2/bin/apachectl -k restart 2>/tmp/apache.err
python mail.py $m "80端口关闭" "已经重启httpd服务"
pn=`pgrep -l httpd|wc -l`
if [ $pn -eq 0 ]
then
python mail.py $m "httpd重启失败" "`head -1 /tmp/apache.err`"
fi
fi

sleep 30
done

 

posted @ 2021-04-28 19:23  小小程序~猿~  阅读(661)  评论(0编辑  收藏  举报