月份:2017年9月


shell习题-打印数字


写一个shell脚本。提示你输入一个暂停的数字,然后从1打印到该数字。然后询问是否继续。继续的话在输入个在数字 接着打印。不继续退出。
例:如果输入的是5,打印1 2 3 4 5  然后继续 输入15   然后打印 6 7 …14 15 依此类推。

 

参考答案:

#!/bin/bash

read -p "请输入您想要暂停的数字:" number_1

for i in `seq 1 $number_1`;
do
        echo $i
done

read -p "是否继续输入数字?" a
if [ $a == "yes" ];then
        read -p "请继续输入您想要暂停的数字:" number_2
        number_3=$[$number_1+1]
        if [ $number_2 -gt $number_1 ];then
                for h in `seq $number_3 $number_2`;
                do
                        echo $h
                done
        else
                echo "输入数字错误,请输入大于的数字!"
        fi
else
        exit
fi

CGI、FastCGI与php-fpm


这几个概念是在lamp、lnmp架构我们遇到的。好多同学对这几个概念一直不明白。下面我就简单说说我的理解。

在web开发领域中有个大概念大家必须要搞清楚,那就是静态和动态。静态就是一些诸如html、图片、js、css等请求元素,它们的特点是不需要和其他资源(比如数据库)打交道,可以直接由web server(httpd、nginx等)处理。如下图:

 

而动态则是需要和数据库等资源打交道的请求,在lamp/lnmp架构中,需要一个中间件(PHP解释器)去解析php代码,然后和mysql数据库打交道。如图:

当Web Server收到 index.php 这个请求后,会启动对应的 CGI 程序,这里就是PHP的解析器。接下来PHP解析器会解析php.ini文件,初始化执行环境,然后处理请求,再以规定CGI规定的格式返回处理后的结果,退出进程,Web server再把结果返回给浏览器。这就是一个完整的动态PHP Web访问流程,接下来再引出这些概念,就好理解多了。

我们再来解释几个概念:

CGI:是 Web Server 与 Web Application 之间数据交换的一种协议。

FastCGI:同 CGI,是一种通信协议,但比 CGI 在效率上做了一些优化。同样,SCGI 协议与 FastCGI 类似。

PHP-CGI:是 PHP (Web Application)对 Web Server 提供的 CGI 协议的接口程序。

PHP-FPM:是 PHP(Web Application)对 Web Server 提供的 FastCGI 协议的接口程序,额外还提供了相对智能一些任务管理。

WEB 中,Web Server 一般指Apache、Nginx、IIS、Lighttpd、Tomcat等服务器,Web Application 一般指PHP、Java、Asp.net等应用程序。

在这里我们还要了解另外一种方式 —— Apache的Module方式。 lamp架构中,php是以一个模块(libphp5.so)的方式被httpd调用的,这个模块是通过sapi把数据交给了php的解释器。

SAPI提供了一个和外部通信的接口,有点类似于socket,使得PHP可以和其他应用进行交互数据(apache,nginx等)。php默认提供了很多种SAPI,常见的提供给apache和nginx的php5_module、CGI、FastCGI,给IIS的ISAPI,以及Shell的CLI。

最后再来说一说,FastCGI为什么比CGI优秀。

不管是CGI还是FastCGI都是专门用来和WEB服务器打交道的,web服务器收到用户请求,就会把请求提交给cgi/fastcgi程序(如php-cgi),cgi/fastcgi程序根据请求提交的参数作应处理(解析php),然后输出标准的html语句,返回给web服服务器,WEB服务器再返回给客户端,这就是普通cgi/fastcgi的工作原理。

cgi和fastcgi不同在于,cgi需要在每一次WEB服务器把请求交给它时都需要启动一次进程,然后处理结束后还要关闭进程。这样当并发量很大时,就会造成服务器资源耗费严重。而fastcgi则为常驻进程,也就是说进程启动后会一直在线,不用频繁开启和关闭。另外fastcgi还支持分布式,也就是说可以支持在web服务器外的其他服务器上运行,通过tcp传输数据。

shell习题-统计分析日志


已知nginx访问的日志文件在/usr/local/nginx/logs/access.log内

请统计下早上10点到12点 来访ip最多的是哪个?

日志样例:

111.199.186.68 – [15/Sep/2017:09:58:37 +0800]  “//plugin.php?id=security:job” 200 “POST //plugin.php?id=security:job HTTP/1.1″”http://a.lishiming.net/forum.php?mod=viewthread&tid=11338&extra=page%3D1%26filter%3Dauthor%26orderby%3Ddateline” “Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3141.7 Safari/537.36” “0.516”

203.208.60.208 – [15/Sep/2017:09:58:46 +0800] “/misc.php?mod=patch&action=ipnotice&_r=0.05560809863330207&inajax=1&ajaxtarget=ip_notice” 200 “GET /misc.php?mod=patch&action=ipnotice&_r=0.05560809863330207&inajax=1&ajaxtarget=ip_notice HTTP/1.1″”http://a.lishiming.net/forum.php?mod=forumdisplay&fid=65&filter=author&orderby=dateline” “Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3141.7 Safari/537.36” “0.065”

 

参考答案:

grep '15/Sep/2017:1[0-2]:[0-5][0-9]:' /usr/local/nginx/logs/access.log|awk '{print $1}'|sort -n|uniq -c |sort -n|tail -n1

shell习题-端口解封


一个同学提到一个问题,他不小心用iptables规则把sshd端口22给封掉了,结果不能远程登陆,要想解决这问题,还要去机房,登陆真机去删除这规则。 问题来了,要写个监控脚本,监控iptables规则是否封掉了22端口,如果封掉了,给打开。 写好脚本,放到任务计划里,每分钟执行一次。

 

参考答案:

#!/bin/bash
# check sshd port drop

/sbin/iptables -nvL --line-number|grep "dpt:22"|awk -F ' ' '{print $4}' > /tmp/drop.txt
i=`cat /tmp/drop.txt|head -n 1|egrep -iE "DROP|REJECT"|wc -l`
if [ $i -gt 0 ]
then
    /sbin/iptables -I INPUT 1 -p tcp --dport 22 -j ACCEPT
fi

两年从硬件售后到运维再到运维开发


本文来自9期学员。

各位同学好,在经历了猿课Linux学习后,进入运维行业工作7个月,再到这个月离职,重新找运维开发工作,就我个人发展谈一下心得,仅供参考。
2014,6月毕业,2015.10月开始Linux运维工作,2016.6月离职找运维开发工作

运维开发面试:

1 搜狗(被刷了)

笔试过了,一面也过了,二面没过;二面难点:github被中国的DDOS攻击,referer都是来自百度,但是百度没有被黑,具体原因是什么?12306这种高并发架构如何实现其架构?故障处理方案?

2 创业公司,数据分析(被刷了)

当面一道算法题:求整数列表 listA中和整数k的值最接近的元素,考虑时间复杂度。反正我是用遍历方法实现了,但是时间复杂度不是最好的,面试官又问了一些乱七八糟的问题,反正被刷了,不太记得

其实找运维开发的这2次面试已经深深的打击了我,忽然感觉自己太菜了,什么都不会,找不到工作。但是我想告诉的是,你找不到工作,那是你不适合这家公司,千万别放弃,事实证明后面我参加的几次面试全部都过了。

3 创业公司,全栈python开发工程师(技术面过了,hr面谈工资被我拒绝了,不想去,全栈工程师太累)

当面考了8道题,最后一个算法题:
2个序列 a和b,无序长度为n,交换a和b中的某个数据,求最后【a所有元素的和】与【b所有元素的和】最接近的情况,考虑时间复杂度最小

4 美图(已经过了一面二面和Hr面,差最后和技术老大谈工资)

没有笔试,一面问的基本上都是你以前干的工作内容,顺便问一下你Linux系统方面的知识,调优啥的;二面问python项目,我基本上就谈了一下我自己在猿课python里面的东西,后面详述。

5 创业大数据公司(14*15k,我说等我考虑几天)

这家公司是IMB出来单干的,50多个研发,7个博士,大部分研究生,本科生少,面试我的是运维开发领导,中科大博士,笔试后谈了自己的python项目。

6.创业大数据云公司(12-14*16k,工资可以和CTO再谈下,等通知)

没笔试,面了2次,谈Linux运维,python项目,其实面来面去就这么些东西,我感觉就是在重复跟面试官谈这些。

后面的面试被我拒了,面试也很累。

其实后面2个公司都是让我自己开价,我说15k 16k他们都是毫不犹豫就答应了(感觉有点亏,要少了)。

面试总结:

Linux运维:你自己工作用到的服务,nginx、tomcat、activemq,rabbitmq,redis,memcached,dubbo,tfs,zookeeper,zabbix,mysql,docker,kvm,虚拟化,分布式框架,一大堆开源软件,能说下原理就行,常用的软件如何调优等等,只要把猿课linux都学完这都不是事
python开发:谈自己做过的项目,有的还有笔试;把猿课python多看看,特别是项目部分,我做过的项目话就是CMDB、分布式监控(从网上找的,自己练手),当然python基础编程什么的还是要回,我感觉我说得最好的就是分布式监控了,用到了redis存储监控值,能达到zabbix类似效果,触发器,监控项等等,其实说起来挺高大上的,但我只学了1个星期就拿出来和别人吹了,哈哈

个人发展心得:

我是2015年8月22学习猿课Linux的,10.14正式上岗干Linux运维,当时工资不到8k,呵呵,上个月说给我涨薪被我拒绝,我直接离职了,其实你们也可以看到我干Linux运维到6月份才一共7个月,那么这7个月我是如何提升的呢?

不得不说这样一句话鸡汤话,“当你看到比你还牛b的人比你还努力,你是一种什么样的感受?”,我10.14干Linux运维,带我的领导百度出身,运维开发啥都会,桌上一大堆书,天天看,还自己加班了解新技术,不仅仅是领导影响了我,还有一个DBA,每天比我来得早走得晚,别人就是在利用其它时间学习。在这种氛围下你不学习都不好意思,慢慢的我就接触公司系统里面的一些东西,学习新的开源软件,写shell脚本,但学python是在春节的时候开始的,每天看视频敲代码,自己琢磨。总之就是只要你学到了东西,还怕没有好公司要你?

后续:

今天15K*14这家公司给我打电话了,他们说对我非常满意,希望我尽快入职,然后我说在考虑,后面也有几家公司想要我,最后谈成了17k*14,明天给offer,下周入职。

shell习题-文件打包


需求:将用户家目录(考虑到执行脚本的用户可能是普通用户也可能是root)下面小于5KB的文件打包成tar.gz的压缩包,并以当前日期为文件名前缀,例如今天打包的文件为2017-09-15.tar.gz。

 

参考答案:

#!/bin/bash

t=`date +%F`
cd $HOME
tar czf $t.tar.gz `find . -type f -size -5k`

shell中的select用法


select也是循环的一种,它比较适合用在用户选择的情况下。
比如,我们有一个这样的需求,运行脚本后,让用户去选择数字,选择1,会运行w命令,选择2运行top命令,选择3运行free命令,选择4退出。脚本这样实现:

#!/bin/bashecho “Please chose a number, 1: run w, 2: run top, 3: run free, 4: quit”

echo

select command in w top free quit

do

case $command in

w)

w

;;

top)

top

;;

free)

free

;;

quit)

exit

;;

*)

echo “Please input a number:(1-4).”

;;

esac

done

执行结果如下:
sh select.sh
Please chose a number, 1: run w, 2: run top, 3: run free, 4: quit

1) w
2) top
3) free
4) quit
#? 1

16:06:58 up 109 days, 22:01,  1 user,  load average: 0.11, 0.05, 0.01

USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT

root     pts/0    222.128.156.84   16:05    0.00s  0.00s  0.00s w

#? 3
total       used       free     shared    buffers     cached
Mem:       1020328     943736      76592          0      86840     263624
-/+ buffers/cache:     593272     427056
Swap:      2097144      44196    2052948
#?

我们发现,select会默认把序号对应的命令列出来,每次输入一个数字,则会执行相应的命令,命令执行完后并不会退出脚本。它还会继续让我们再次输如序号。序号前面的提示符,我们也是可以修改的,利用变量PS3即可,再次修改脚本如下:

#!/bin/bash

PS3=”Please select a number: ”

echo “Please chose a number, 1: run w, 2: run top, 3: run free, 4: quit”

echo

select command in w top free quit

do

case $command in

w)

w

;;

top)

top

;;

free)

free

;;

quit)

exit

;;

*)

echo “Please input a number:(1-4).”

esac

done

如果想要脚本每次输入一个序号后就自动退出,则需要再次更改脚本如下:

#!/bin/bash

PS3=”Please select a number: ”

echo “Please chose a number, 1: run w, 2: run top, 3: run free, 4: quit”

echo

select command in w top free quit

do

case $command in

w)

w;exit

;;

top)

top;exit

;;

free)

free;exit

;;

quit)

exit

;;

*)

echo “Please input a number:(1-4).”;exit

esac

done

我都而立之年了,还在不断学习


这是9期学生的一篇找到工作后的心得分享,写于2016年9月。

本人去年9月份报名,到目前已是正式员工(三个月试用期),从去年九月到三月;陆陆续续在学习、玩耍中度过;期间一边上班,一边照顾家里人;想想都觉得累,可是还是过来了, 今年三月份开始投简历,期间陆续接到好多面试邀请,可能有IT工作经验吧?但是没有linux运维经验;说说面试几家情况吧?

1、一家做金融一卡通的公司, 公司有不到一百台机器;头一次面试运维,紧张的不得了, 都不知道怎么从那家走出来的,可想而知,被他们技术一顿狂虐; 针对我简历上;画架构图、原理、lvs种类等

2、一家做医疗自动化产品的,公司不足50人,问下了nginx、mogondb、redis、tomcat等等,因为有了前一次的体验,所以报着无所谓态度;和他们技术经理、HR聊了两个小时、后来因为老板不在,所以下次接着面;后来老板也面了,HR又面了,通过 8k 13薪 双休;三线城市;我觉得可以了, 就立马回去辞职(上一家IT工作,单休,上班上的累 、薪资5K不到);

3、一家外包公司,中午12点到的, MD,一进去,什么话都没有, 就是做测试题目(心里测试、数学题目什么的)足足10页A4纸张,还正反面都有;做着做着就没心思了, 随便花花就结束了,了解了是外包公司、驻场的;没有问技术,只是听他唠唠叨叨说了半天,可想而知没有了下文;

4、一家做车辆什么公司;很早就到了, 和技术经理面试了聊了半天;还是针对架构图,糊里糊涂聊了一个小时左右,后来他去找相关人员聊了半小时,就让我回来等通知;一等就知道没有消息了;

4月11日入职新的公司,进去才知道,试用期半年,双休、试用期不打折;可是做着做着发现,怎么又是IT工作;什么邮箱、网络、百度推广、电脑、笔记本、我的天啊;这是加了工资的IT,我想这不是我需要的;心想:以后十年、二十年之后IT我还可以做,但是运维呢,我一辈子都是IT了;不行、找了老板谈谈,这不是linux运维的工作;(老板居然连运维和IT工作内容都分不清,我和他们解释了一边;后来才知道都是HR在网络上复制了招聘要求;给他们也上了一课);

期间接到其他几家面试;也推掉了;因为查了下他们需求,都不是单独的运维工作;但是有一家公司-某电商:HR电话,先和HR聊了,后面技术面试;然后HR回复(确认);中途,也忐忑过, 我是零基础的啊,怎么会找到我的呢,一周后,正式发来offer;

五月三日从这家离职;26号入职这家电商,年薪12W-16W,5*8,双休;(之后又接到3-4家面试,都推掉了);

到目前三个月试用期已过;期间也想:学学也挺好;即使试用期不过, 我也是有经验(简历上可以吹吹了,你懂的);经历了三个月学习,这家果然不一样:kvm、openstack、VM、mysql、redis、saltstack、jboss、was、MQ、apache、nginx、db2、Tomcat、resin、python、shell、oracle、java等等;几乎所有都涵盖了;最近要上docker等等;物理机几千台,虚拟机几万台…..我想说的是:学无止境!我们领导也说了:是看重你能够学习,对自动化比较感兴趣的;目前在本职工作之余,学习python、我想python是自动化运维的基础;

我都而立之年了,还在不断学习,你们呢?有时候我总是在想:之前第二期为什么不报名(之前就一直关注阿铭老师的课程、想想当时才800块;有点遗憾!!);找个好的老师,确实不一样(虽然我没有怎么问过问题);老师带入这行了;以后的路还是得靠自己;如果我不走这路;我还是IT;还在做着之前“讨厌”的工作(脑海里还会浮现,投影仪怎么不显示了、显示器怎么不亮了、UPS报警了、去把门禁注册下、ERP访问不了了、打印机墨盒没了、传真机卡纸啦……….);在这里感谢阿铭老师,也感谢下自己;

希望大家一起学习,不要给自己找借口;机会是把握在自己手里的;请相信老天是公平的。

shell习题-监控web可用性


写一个shell脚本,通过curl -I 返回的状态码来判定所访问的网站是否正常。比如,当状态码为200时,才算正常。

参考答案:

#/bin/bash

url="http://www.apelearn.com/index.php"
sta=`curl -I $url 2>/dev/null |head -1 |awk '{print $2}'`

if [ $sta != "200" ]
then
    python /usr/local/sbin/mail.py xxx@qq.com "$url down." "$url down"
fi

shell习题-监控网卡


1 每10分钟检测一次指定网卡的流量

2 如果流量为0,则重启网卡

参考答案:

#!/bin/bash

LANG=en
n1=`sar -n DEV 1 60 |grep eth0 |grep -i average|awk '{print $5}'|sed 's/\.//g'`
n2=`sar -n DEV 1 60 |grep eth0 |grep -i average|awk '{print $6}'|sed 's/\.//g'`
if [ $n1 == "000" ] && [ $n2 == "000" ]
then
    ifdown eth0
    ifup eth0
fi

然后写个cron,10分钟执行一次