Shell练习题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Shell练习题相关的知识,希望对你有一定的参考价值。

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

#! /bin/bash
[email protected]
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

(2) 域名代理

内网有一台机器不能连外网,所以没有办法使用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上加一条hosts192.168.5.11 aaa.com bbb.com ccc.com ddd.com eee.com

(3)备份数据库

设计一个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

(4)自动重启nginx服务

服务器上跑的是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
N=10
while :; do
    ##因为10秒钟大概产生300条日志
    tail -n 300 $log > /tmp/log
    n_502=`grep -c ‘ 502"‘ /tmp/log`
    if [ $n_502 -ge $N ]; then
        ##记录系统的状态
        top -bn1 >/tmp/`date +%H%M%S`-top.log
        vmstat 1 5 >/tmp/`date +%H%M%S`-vm.log
        /etc/init.d/php-fpm restart 2>/dev/null
        ##重启php-fpm服务后,应先暂缓1分钟,而后继续每隔10s检测一次
        sleep 60
    fi    
    sleep 10
done

(10)删除文本中的字母

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

假设文本名字叫做1.txt,并且文本行数大于10,脚本如下

#!/bin/bash
##先获取该文本的行数
nu=`wc -l 1.txt |awk ‘{print $1}‘`
##对前5行进程处理
for i in `seq 1 5`
do 
    ##使用sed把每一行的内容赋值给变量
    l=`sed -n "$i"p 1.txt`
    ##用grep 判定是否匹配字母,-v取反,-q不输出内容
    if echo $l |grep -vq ‘[a-zA-Z]‘
    then
	echo $l
    fi
done
##对6-10行做删除字母处理
for i in `seq 6 10`
do
    l=`sed -n "$i"p 1.txt`
    echo $l|sed ‘s/[a-zA-Z]//g‘
done
##剩余的直接输出
for i in `seq 11 $nu`
do
    sed -n "$i"p 1.txt
done
##若想把更改内容写入到1.txt,还需要把以上内容重定向到一个文本中,然后删除1.txt,再把刚刚重定向的文件更名为1.txt


本文出自 “A man & A computer” 博客,请务必保留此出处http://juispan.blog.51cto.com/943137/1951343

以上是关于Shell练习题的主要内容,如果未能解决你的问题,请参考以下文章

shell习题-批量同步代码

shell脚本练习题

shell练习题

Python练习册 第 0013 题: 用 Python 写一个爬图片的程序,爬 这个链接里的日本妹子图片 :-),(http://tieba.baidu.com/p/2166231880)(代码片段

spring练习,在Eclipse搭建的Spring开发环境中,使用set注入方式,实现对象的依赖关系,通过ClassPathXmlApplicationContext实体类获取Bean对象(代码片段

Shell练习小程序练习练习——九九乘法表