#!/bin/bash n=netstat -lntp|grep ':80 '|wc -l #stat=nmap -p 80 127.0.0.1|grep 'tcp/80'|awk '{print $2}' m=123qq@.com while : do if [ $n -eq 0 ]

if [ $stat == "closed" ]

  then
/usr/local/apache2.4/bin/apachectl -k restart  2> /tmp/apache2.4.err
python mail.py $m "zhuti" "chongqi httpd fuwu"
    pn=`pgrep -l httpd|wc -l`
    if [ $pn -eq 0 ]
       then 
	python mail,py  $m  "httpd service chongqi shibai"  "head -l /tmp/apache2.4.err" 
fi
sleep 30

done

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

核心要点 检测80端口使用nmap -p 80 127.0.0.1或者netstat -lntp|grep -w 80 重启httpd服务的命令要知道 发邮件脚本依然使用mail.py

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

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

核心要点 备份数据库的命令 同步到远程去的命令 本地一周,可以用date +%w做为后缀,远程一个月可以用date +%d做为后缀

#!/bin/bash d1=date +%w d2=date +%d local_bakdir=/bak/mysql remote_bakdir=192.168.123.30::backup exec 1> /tmp/mysqlbal.log 2>/tmp/mysqlbak.err echo "mysql backup begin at date" mysqldump -uroot -pxxxx discuz >$local_bakdir/discuz.sql.$d1 rsync -az $local_bakdir/discuz.sql.$di $remote_bakdir/discuz.sql.$d2 echo "mysql backup end at date"

服务器上跑的是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

要点 用curl检测状态码是否是502或者通过分析访问日志判断状态码的比率 重启php-fpm服务的命令

#!/bin/bash log=/data/log/access.log 502n=tail -n 300 $log|grep -c ' 502 ' while : do if [ -z $502_n ] then exit fi if [ $502_n -ge 5 ] 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 123qq@.com "zhuti" "neirong" exit fi fi sleep 10 done

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

核心要点 sed命令

#!/bin/bash sed '1,5'p qq.txt|sed '/[a-zA-Z]/d' sed '1,5d' qq.txt|sed '1,5s/[a-zA-Z]//g'

题目要求 用shell打印下面这句话中字母数小于6的单词。 Bash also interprets a number of multi-character options.

核心要点 for循环遍历所有单词 wc -L获取字符串长度 #!/bin/bash c="bash also interprets anumber of mutil-character options." n=echo $c|awk -F '[ +-.]' '{print NF}' for ((i=1;i<$i;i++)) do l=echo $c|awk -F '[ +-.]' -v j=$i '{print $j}'|wc -L if [ $l -lt 6 ] then echo $c|awk -F '[ +-.]' -v j=$i '{print $j}' fi done