shell习题100(二)
2019-01-03 22:36
495 查看
版权声明:版权所有,转载请注明出处。email:luxifa33@gmail.com https://blog.csdn.net/qq_42334372/article/details/85726197
题目要求
写一个脚本,判断本机的80端口(假如服务为httpd)是否开启着,如果开启着什么都不做,如果发现端口不存在,那么重启一下httpd服务,
并发邮件通知你自己。脚本写好后,可以每一分钟执行一次,也可以写一个死循环的脚本,30s检测一次。
核心要点
- 检测80端口使用nmap -p 80 127.0.0.1或者netstat -lntp|grep -w 80
- 重启httpd服务的命令要知道
- 发邮件脚本依然使用mail.py
参考答案
#!/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
题目要求
设计一个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/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`"
题目要求
服务器上跑的是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 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
题目要求
把一个文本文档的前5行中包含字母的行删除掉,同时把6到10行中的全部字母删除掉。
核心要点
sed命令
参考答案
#!/bin/bash sed -n '1,5'p 1.txt |sed '/[a-zA-Z]/d' sed '1,5d' 1.txt |sed '1,5s/[a-zA-Z]//g'
示例文件1.txt内容
1111111111111111111 121212aaasdasdf asdfasdfasdfasdfasdf 12121212aklsdfjaklsdfkjk *****#)#((@#*@)1121212 root@gitlba-aming shell100 12aaasdas23asdfasdf asdf;lkjas;lkdjfkl;ajsdf asl;dkfjalskdjflkj2elkjwlkej23kijlkjasdf laksjdflkjslkdjfslkdjflksjdf 21l3k2l3k2l3kjl2k3jl2k3j askdjfklasjdflklkajlksdjfkl12323232323 asdklfjalksdf asldkfjalksdjfalksdjfklasjdf2323 aslkdjflk2k3j2lk3jl2k3j asdklfjalksjdflkj132 asdfkjalksdjf121adfavasdfads asldkfjalksdjf lkjlkjlwkerlk2j3lk21j3lkjflkasjdlkj23lkj klaj d
题目要求
用shell打印下面这句话中字母数小于6的单词。
Bash also interprets a number of multi-character options.
核心要点
- for循环遍历所有单词
- wc -L获取字符串长度
参考答案
#!/bin/bash c="Bash also interprets a number of multi-character options." n=`echo $c|awk -F '[ +-.]' '{print NF}'` for ((i=1;i<$n;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
相关文章推荐
- shell习题100(三)
- Java课后习题——编写程序求100以内的素数并输出
- shell习题-清理日志
- 习题 2.4(6) 将100~200之间的素数输出。
- shell脚本100练习题,答案见下一条博客。
- adb shell input swipe 1000 100 0 0
- shell习题-处理日志
- 一次shell的随机数习题
- 生成1到100的shell脚本
- Shell 脚本 100 例《十》
- Shell 编程测试习题
- 习题:求1-100内奇、偶数的个数、和值与平均值
- shell习题-判断函数
- shell 计算1 100 相加
- 习题 5.7 求k=1,k到100的相加和,k平方到50的相加和,1/k到10的相加和。
- shell之1+100
- 在 Linux 环境下用 shell 命令求 1-100 的和
- Shell 脚本 100 例《八》
- Shell 脚本 100 例《九》
- 【shell】1至100的累加和