Shell练习题(2)

(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
时间: 2024-10-24 23:01:45

Shell练习题(2)的相关文章

shell练习题:使用for循环批量修改文件扩展名

shell练习题:使用for循环批量修改文件扩展名 说明:(1)在linux下批量修改文件名,将下图所示命令中的"_linux"去掉. (2)使用for循环脚本. 思路:本题的基本解题思路,先进行单个文件的改名,然后再用循环实现批量改名,这是比较常规的做法,也可以用rename专业改名工具. 方法一: 说明:使用cut.sed工具 脚本如下: #!/bin/bash cd /test for i in `ls|grep .*.jpg` do mv $i `echo $i |cut -d

shell 脚本之 shell 练习题汇总

整理了一些 shell 相关的练习题,记录到这里. 1. 请按照这样的日期格式 xxxx-xx-xx 每日生成一个文件,例如:今天生成的文件为 2013-09-23.log, 并且把磁盘的使用情况写到到这个文件中. 1 #!/bin/bash 2 # Date: 2016-12-22 3 # Author: liwei 4 5 today=$(date +%Y-%m-%d) 6 log_file_name=/var/log/selfdefine/${today}.log 7 /bin/df -l

bash编程:Shell练习题

bash编程:练习题 1. 写一个脚本:如果某路径不存在,则将其创建为目录:否则显示其存在,并显示内容类型 #!/bin/bash # baseurl=/var/tmp/testdir if [ -e $baseurl ]; then echo "file is no exists." else mkdir -p $baseurl file $baseurl fi 2. 写一个脚本,完成如下功能:判断给定的两个数值,孰大孰小:给定数值的方法:脚本参数,命令交互 #!/bin/bash

shell 练习题01:列出使用最多的命令是哪些并且将这些命令输入到chy1.txt中

需求:列出使用最多的命令是哪些并且将这些命令输入到chy1.txt中 思路:我们的命令都是存在了历史文件/root/.bash_history 这个文件里面,这里需要将用到的命令进行排序 [[email protected] shell]# vim history.sh  #!/bin/bash #this is liechu history zuiduodmingling sort /root/.bash_history |uniq -c |sort -nr |head >/tmp/chy1.

shell 练习题02 一个文件里将内容三行显示为一行

要求: 一个文件里将内容三行显示为一行 思路:是将第二行的内容,第三行的内容依次附加到第一行中,这样三行的内容就能变为一行,如果不够三行自动融为一行,具体如下 [[email protected] shell]# cat /tmp/chy.txt  1 2 3 4 g 6 8 (查看chy.txt的内容) [[email protected] shell]# vim yihang.sh #!/bin/bash #this is san hang bian wei yi hang sed 'N;N

30道shell练习题

1  先测试"/etc/vsftpd"."/etc/hosts"是否为目录,并通过"$?"变量查看返回状态值,据此判断测试结果. [[email protected] ~]#  [ -d /etc/vsftpd ] [[email protected] ~]# echo $? 1 [[email protected] ~]#  [ -d /etc/hosts ] [[email protected] ~]# echo $? 1 2  测试&quo

shell练习题

1.命令test或[可以测试一个条件是否成立,如果测试结果为真,则该命令的返回状态为0:如果测试结果为假,则该命令的返回状态为1.(与C语言的逻辑表示正好相反) 2.  -eq(等于) -ne(不等于) -lt(小于) -le(小于等于) -gt(大于) -ge(大于等于) 它们的操作对象是整数或者取值为整数的变量. 3. -a(逻辑与) -o(逻辑或) !(逻辑或) &&和||用于连接两个命令,而-a.-o仅用于在测试表达式中连接两个测试条件. 4.1~100之间的求和 (1)递归 运行

shell练习题讲解

写一个脚本,计算100以内所有的奇数的和以及所有偶数的和,分别显示出来#! /bin/bashsum1=0for i in `seq 1 2 100`do sum1=$[$sum1+$i]doneecho $sum1 sum2=0for j in `seq 2 2 100`do sum2=$[$sum2+$j]doneecho $sum2 写一个脚本,利用RANDOM生成10个随机数,并且找出最大值和最小值 for i in `seq 1 10`do n[$i]=$RANDOM echo ${n

Shell练习题(1)

(1)请按照这样的日期格式(xxxx-xx-xx)每日生成一个文件,例如今天生成的文件为2017-07-05.log, 并且把磁盘的使用情况写到到这个文件中,(不用考虑cron,仅仅写脚本即可)! #! /bin/bash d=`date +%F` logfile=$d.log df -h > $logfile (2)统计日志 有日志1.log,内容如下: 日志片段: 112.111.12.248 - [25/Sep/2013:16:08:31 +0800]formula-x.haotui.co