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。
我们设定:
access_log /data/log/access.log
脚本死循环,每10s检测一次(假设每10s钟的日志条数为300左右)
重启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练习题的主要内容,如果未能解决你的问题,请参考以下文章
Python练习册 第 0013 题: 用 Python 写一个爬图片的程序,爬 这个链接里的日本妹子图片 :-),(http://tieba.baidu.com/p/2166231880)(代码片段
spring练习,在Eclipse搭建的Spring开发环境中,使用set注入方式,实现对象的依赖关系,通过ClassPathXmlApplicationContext实体类获取Bean对象(代码片段