月份:2017年10月


shell习题-问候用户


写一个脚本,依次向/etc/passwd中的每个用户问好,并且说出对方的ID是什么
Hello,root,your UID is 0.

 

参考答案:

awk -F ':' '{print "Hello,"$1",your uid is "$3.}' /etc/passwd

刚刚做运维工作


北京,9期,13k,网管转型运维

先来说说这份工作的面试吧!以前也发过帖子,主要有shell,mysql,zabbix,nginx,redis,rsync,ansible,其中shell最重要。好了面试就说到这,反正大家认真学,基本的都会,但是shell就是看大家自己的学习态度了,我是练习的人家出个想法自己基本2,3分钟内就可以想出逻辑。

刚开始工作的时候,基本不知道自己干什么,第一天我记得非常清楚,给我一台电脑叫我自己装一些自己常用的软件,但是没干过,我哪知道装什么,东拼西凑装了好几个,后来实际用的也就是个xshell,和一个笔记工具。

工作了,上来就是叫我搞监控用zabbix ,公司什么报警都没有,也没给我标准自己去搞吧,幸亏帮同学搞过没有晕头,但是最后还是挨批了 ,时间太长做了2个星期没出来。

哎怪自己太贪心不会玩,其实可以先把cpu、硬盘、内存等基础的先搞出来,然后再完善。我搞的时候是想全部都搞定的,什么nginx php redis mongo mysql 等等一起搞出来。早知道1天就搞定了,以后的再优化。

之后就是搞网站迁移,插件安装,svn 等等。自己是边学边干,感觉自己进步挺快的。在这个期间,写了差不多40个监控脚本,和守护进程脚本。还有2,3个安装脚本。用ansible写的布置yml也有10几个。就这样2个月就过去了。

这2个月给我最大的感受就是shell和ansible太有用了,可以节省自己很多时间,现在也在学习python。因为公司现在用的是dijago以后python一定会用上。
好了牢骚了这么多。希望大家努力学习。都会一份自己满意的工作和可以接受的工资。哦工资没说,月薪13k。

在这里谢谢铭哥把我带进这个圈子,不是铭哥我估计我现在还是在当网管。谢谢九期的小伙伴,大家一起学习的日子。希望大家在以后的工作中都能实现自己的目标。

shell习题-打印正方形


交互式脚本,根据提示,需要用户输入一个数字作为参数,最终打印出一个正方形。

在这里我提供一个linux下面的特殊字符■,可以直接打印出来。

示例: 如果用户输入数字为5,则最终显示的效果为

■ ■ ■ ■ ■

■ ■ ■ ■ ■

■ ■ ■ ■ ■

■ ■ ■ ■ ■

■ ■ ■ ■ ■

 

参考答案:

#!/bin/bash

read -p "please input a number:" sum
a=`echo $sum |sed 's/[0-9]//g'`
if [ -n "$a" ]
then
    echo "请输入一个纯数字。"
    exit 1
fi

for n in `seq $sum`
do
    for m in `seq $sum`
    do
        if [ $m -lt $sum ]
        then
            echo -n "■ "
        else
            echo "■"
        fi
    done
done

shell习题-判断没有文件


判断所给目录内哪些二级目录下没有text.txt文件。

有text.txt文件的二级目录,根据文件计算选项中单词数最大的值(选项间以|分割,单词间以空格分隔)。

假如脚本名字为1.sh, 运行脚本的格式为 ./1.sh  123  root,其中123为目录名字,而root为要计算数量的单词。

说明: 这个shell脚本题目出的有点歧义。 原题给的描述不是很清楚,我另外又改了一下需求,依然不是很清晰。在这里我再做一个补充: 对于有test.txt的目录,计算出该test.txt文件里面所给出单词的次数。不用找最大。

 

参考答案:

#!/bin/bash

if [ $# -ne 2 ]
then
    echo "useage $0 dir word"
    exit 1
fi

if [ -d $1 ]
then
    cd $1
else
    echo "$1目录不存在"
    exit 1
fi

for f in `ls $1`
do
    if [ -d $f ]
    then
    if [ -f $f/test.txt ]
    then
        n=`grep -cw "$2" $f/test.txt`
        echo "$1/$f/test.txt 里面有$n个$2"
    else
        echo "$1/$f 下面没有test.txt"
        fi
    fi
done

杀了5回,寻得出路


各位小伙伴好,我是15期学员,今年4月报名的,报名之前是做系统支持的,也就是处理客户在使用系统中的一些问题,相当于售后工作;每个月拿着5K的工资,扣了该扣的,到手也就4K多左右,在深圳这个高消费的城市4K多生活还是很坚难的。

报名之后学了一个月,后面也没怎么学,总是学下,玩下,学下,玩下,学了后面的忘记前面的,我这人有个坏毛病,自制力超级差,差到什么程度勒。差到铭哥都对我无语了,认为我无药可救的地步了,不过后面铭哥还是一直督促我学习,询问我为什么没有回复专贴;为了逼自己学习,于是6.17我从在职的公司果断辞职了,埋头在家学习了一个半月,把所有的课程过一遍,不懂的在VIP群里问下同学,和直接QQ上问铭哥,每次铭哥都很负责任的回答我。

看完了第二个阶段的课程,我就更新了下简历,更新之前把简历发给铭哥指点了下;没有刻意去投简历到公司,都是让他们找我的(北上广运维人才需求还是很大的),接到面试电话我就用纸记上,尽量公司地址不远都安排在一个时间段(比如,第一家公司在福田安排在上午9点,如果后面还有一家福田的公司打电话给你,你就可以按排在10.30,一般一个半小时面试时间充足了)这样下来一天就可以面试四家左右,但人很累是真的;好了,下面我简单介绍下这几天的面试情况;说得不好大家见谅!

第一 家

8.4号下午接到的一个面试,是做金融的,运维是外包的,HR叫要离职的运维直接打电话给我的,电话简单聊了下,我直接告诉人家我mysql很弱,结果那面试的运维说没事,过来聊下,于是我8.5号上午就过去,到了地方,打电话给他,他拿着我的简历出来,说会议室有人,问我抽烟吗,我说抽,直接把我拉到抽烟区,边抽烟,边问我,主要问的是:LAMP、LVS原理,LVS三种模式,iptables(如果80端口允许通过,其它所有端口不允许通过,请问是先能允80还是先拒绝所有)我回答当然是先允许后拒绝所有;后面就一直追着我问mysql方面的,我当时主不懵B了,(脏读,幻读,四个隔离级别,mysql主从,读写分离)总之边聊边抽烟,抽了大概5,6支左右,面试完了,我都跑厕所吐了;后面打道回俯;

第二家

下午,坐了个把小时车,转了N次车,到达深圳科技中心 科技园,到达公司,递交简历,坐会议室等待,一会人事总监,过来跟我面试,叫我简单介绍自己,介绍完了之后,告诉我,他们这边服务器都是开发在管理,他们现在要招一个网管,来管理公司内部的PC ,还问我会不会装win ios 系统,问了些防火墙,路由方面的;简单答了下,下楼走人;

第三家

8.8号,星期一,下午,去凯立德导航面试,到了先做面试题,在群里小伙伴,跟我弟的帮助下,顺理完成简单得不能再简单的面试题,做完交卷,技术主管来了,先简单介绍下自己,然后就问了之前做运维做过那些,我把lamp.lnmp,主从  ,简单的介绍了下,中间也聊了蛮多,具体聊啥忘记了,结果到最后面试官来句,你对WEB服务器方面很熟悉,但是我们招的是大数据方面的,结果当时就无语了,你招大数据方面精通的,那你叫我来嘎哈!

然后面试完成,下楼,抽只烟,继续去旁边不远的一栋写字楼面试第二家(这就是安排在一起的好处,面试完一家可以继续不远处面试第二家) 走在路途中的时候,这家的HR就问我到哪了,我说我到楼下了,上楼,填了个面试报告,应该是开发的面试主管来了,去会议室(有人),所另找一个地方,直接去公司旁边的小房间,开门的一瞬间,当时就无语了,(我草,杂物间,里面什么乱七八遭的都有)当时心里一万只草尼马跑过,简单介绍下,(实在是没心情介绍自己)真的简单的介绍了下,问了下LAMP LNMP原理,nginx 的常用优化,面试完成,提包闪人。

第五家

也就是正式入职的一家。路程蛮远的,拉勾上直接聊的,由于路程蛮远,提前过去了,真心远,不过HR说月底搬科技园,所以才考虑去面试,到了之后,公司在类似工业区里面,真心很小,交了简历,一会HR跟面试官一起面试,先自我介绍下,此处省N字,然后面试官开始问了:

你对运维怎么理解的,答:系统安全,保障系统业务的维定,提前预防和处理发生的故障。好像就答了这三点。

然后问 你们平时用什么做系统监控,(cacti监控硬件,nagios 或zabbix监控软件)我会说我是在去的路上用手机登陆猿课APP看了监控介绍吗,哈哈!

继续问,你们平时是怎么做到保障一台面宕掉,另外一台面马上接手业务的;当时我有点懵,随口就说了:做主从,数据同步,一台从宕掉,另外一台会马上接手任伤。(我也不知答得对不对)

后面还问了LAMP LNMP原理性的东西,然后我又自己给自己挖了坑,我说我Mysql很弱,面试官直接问,你不是做过主从吗,怎么会弱勒。当时就懵B了,心想这下完了;

然后又继续问,你之前公司主从是你做的吗,我很肯定说:是的。然后问我,我们会司就你一个,你有信心搞定吗。我直接说:有信心。

问完,又问我有什么想了解他们公司的吗?我问了下公司主要做什么,有多少台服务器,在完成自己工作后,能不能自己学习新的东西(这点很重要,要表现有你好学,公司都喜欢好学的员工)。

然后面试官问我,未来的一个方向是什么:我说开发型运维,后面肯定是要去学python的。他说你以后就是想往自动化运维方面发展是吗?我说是的。

然后面试完成,HR问我要期望多少薪资,我没敢多要要了8.5。结果今天下午打电话给我说明天过来入职;给了8K  试用期2个月6K。好了就这么多,希望各位都能转型成功,找到好工作!在次感谢铭哥,带我入门,找到人生一第份运维工作。

shell习题-计算器


用shell写一个简易计算器,可以实现加、减、乘、除运算,假如脚本名字为1.sh,执行示例:./1.sh 1 + 2

 

参考答案:

#!/bin/bash

if [ $# -ne 3 ] 
then
    echo "参数个数不为3"
    echo "当使用乘法时,需要加上脱义符号,例如 $0 1 \* 2"
    exit 1;
fi

num1=`echo $1|sed 's/[0-9.]//g'` ;
if [ -n "$num1" ] 
then
    echo "$1 不是数字" ;
    exit 1
fi

num3=`echo $3|sed 's/[0-9.]//g'` ;
if [ -n "$num3" ]
then
    echo "$3 不是数字" ;
    exit 1
fi

case $2 in
  +)
    echo "scale=2;$1+$3" | bc
    ;;

  -)
    echo "scale=2;$1-$3" | bc 
    ;;

  \*)
    echo "scale=2;$1*$3" | bc 
    ;;

  /)
    echo "scale=2;$1/$3" | bc 
    ;;
 
  *)
   echo  "$2 不是运算符"
   ;;
esac

shell习题-自动添加项目


需求背景:
服务器上,跑的lamp环境,上面有很多客户的项目,每个项目就是一个网站。 由于客户在不断增加,每次增加一个客户,就需要配置相应的mysql、ftp以及httpd. 这种工作是重复性非常强的,所以用脚本实现非常合适。

mysql增加的是对应客户项目的数据库、用户、密码,ftp增加的是对应项目的用户、密码(使用vsftpd,虚拟用户模式),httpd就是要增加虚拟主机配置段。

 

参考答案

#!/bin/bash

webdir=/home/wwwroot
ftpudir=/etc/vsftpd/vuuser
mysqlc="/usr/bin/mysql -uroot -xxxxxx"
httpd_config_f="/usr/local/apache2/conf/extra/httpd-vhosts.conf"

add_mysql_user()
{
        mysql_p=`mkpasswd -s 0 -l 12`
        echo "$pro $mysql_p" >/tmp/$pro.txt
        $mysqlc <<EOF
        grant all on $p.* to "$pro"@'127.0.0.1' identified by "$mysql_p";
EOF
}

add_ftp_user()

{
        ftp_p=`mkpasswd -s 0 -l 12`
        echo "$pro" >> /root/login.txt
        echo "$ftp_p" >> /root/login.txt
        db_load -T -t hash -f /root/login.txt  /etc/vsftpd/vsftpd_login.db
        cd $ftpudir
        cp aaa $pro   //这里的aaa是一个文件,是之前的一个项目,可以作为配置模板
        sed -i "s/aaa/$pro/" $pro  //把里面的aaa改为新的项目名字
        /etc/init.d/vsftpd restart
}

config_httpd()

{
        mkdir $webdir/$pro
        chown vsftpd:vsftpd $webdir/$pro
        echo -e "<VirtualHost *:80> \n     DocumentRoot "/home/internet/www/$pro/" \n     ServerName $dom \n    #ServerAlias \n</VirtualHost> " >> $httpd_config_f
        /usr/local/apache2/bin/apachectl graceful
}

read -p "input the project name: " pro
read -p "input the domain: " dom

add_mysql_user
add_ftp_user
config_httpd

这小说,不看可惜了


说明: 15期的,深圳

今天面了一家,虽然没当场给offer,但跟技术总奸跟hr聊过之后感觉有戏,也怕自己忘记了,发个帖子给司机们参考一下。

先说说我面的第一家的情况吧。我是7.18号下午三点左右投的的简历,当天6点就有电话让我面试了,一家做餐饮app的,地点闹市区,简单看了下招聘要求和复习对应的知识紧张又兴奋的去了,到了好失望,虽说是市区,可十几年楼龄的商住两用楼也太坑了吧 ,一出电梯,这啥啊,这这这…不是荒废多年的豆腐小作坊嘛,额。。。深呼吸。。。来都来了,打个怪吃个经验再走呗。

进门坐下,自我介绍。。。根据简历问了下ha和lb,mysql主从,忽悠过去,二面老大模样的来了,来了直接放大招,ssd读取速度是普通硬盘的多少倍,额..2倍..哦不是…啊,不知道。砰,子弹穿膛过,扶着墙抗住了。。。用的什么防火墙…懵逼三秒,额用的iptables和依赖阿里云的云骑士。哦…停顿三秒,还有什么要求吗… 那个要求的月薪可以达到吗…有经验的老手可以…嗯,明白,憋着最后一口气退出来了,面了15分钟,坐两个半小时车屁颠屁颠回去…

好久没打怪,被怪打死了。主城复活,下个BOSS直聘,又上传了自己diy的简历,眼一睁又一闭,第一天过去了,好吧,没有音讯。第二天早上好像发生了化学反应,咚咚咚要了三份简历给了三个面试邀请。。。

第一家离家不远,做O2O 移动app运营的,看了下招聘要求,感觉这个怪不是红色的,还是个女怪,比较喜欢,目测可以吃下。对应招聘要求做了针对性复习,官网了解了下(感觉跟hr谈的时候起了点效果),又在草稿上列举了自己该问的问题,比如公司服务器环境,防火墙(感谢打死我的老妖怪),架构,是否有做ha和lb(感觉这些是万金油)…装备哦了,准备出门收怪… …

套路开始:自我介绍—工作经历—职责。Ok,技术总奸开始出招了。

1 知道哪些服务器版本,用的哪些,ubuntu知道吗,无难度,pass

2 yum安装和源码安装有什么区别,(yum我主要用于依赖库的安装,自定义安装的服务和软件用源码,可以自定义路径,精简参数,不知道对不对)

3 Mysql主从实现(heartbeat keepalived.),两者有什么区别(keepalived更容易配置,不是大型网络优先keepalived….)

3 你了解的读写分离中间件(mysqlproxy,360的一个叫啥,叫不出名字,也是根据mysqlproxy优化的,mycat后面才想到, mycat是从求职群的消息知道,感谢铭哥,你给我的不只是知识,更是圈子,人脉)

4 mysql的主从版本不一致,从某天挂掉了,如何恢复(心想这是考主从原理啊,主从版本跟这有关系吗,烟雾弹吧,不管了,直接说出主从原理)… …继续

5 做过mysql调优吗,说说一些参数(datadir,basedir,sock…依稀记得spare_size,max_connections..不知道对不对,不管了,说出来了)

6 用户直观的感觉访问很慢咋办(看下slow_log,看看哪条sql语句慢,这里装了下逼,把论坛里的mysql优化的一个例子说出来,是myisam转换为innodb,key设置为null那个,感谢那位师兄),如果看slow_log,没发现有慢查询呢,但是开发同事连接很慢呢,是通过主机名连的吗?不是,是ip,哦那ping 下mysql所在主机是否有丢包,有就查网络原因,ping值正常就show processlist,看看那些sql在使用mysql资源,不知道对不对,当时就这么答了

7 Lvs的三种模式,说说你知道的,额,小怪,无难度,nat模式适用于20台一下的网络环境,因为是nat转发,遭受ddos攻击容易波及其他服务器…dr模式就把原理答了下…

8 写过脚本吗,当然写过,最有挑战性的就是写了交互式安装lanmp环境的脚本(盗用课程,铭哥收下我膝盖)

9 对监控了解吗,说下你认为有心得的:最有心得的就是自定义脚本添加到nagios实现个性化监控

10 自动化运维工具(重点说了ansible)。

被强奸了N次后,总奸总算说了他们现在的环境,架构和现在的瓶颈(tomcat相关),然后说了下我如果入职负责哪些哪些方面。。。接下来hr(s少妇)来又轮了我一遍,砍掉2K后说我能接受不(好爽,接受了。问这个薪资怎么得出来的,我说能力匹配,然后说了下我要的薪资有波动区间主要是考虑到市区生活成本高,你提出的xxxk,基于龙岗这样的水平,可以接受)……小伙子,8.1号通知你(7月底才完全离职)…

终于写完了,看完的举爪支持下… …

shell习题-获取子进程


说明:本shell题目是一个网友在公众号中提问的,正好利用这个每日习题的机会拿出来让大家一起做一做。

给出一个进程PID,打印出该进程下面的子进程以及子进程下面的所有子进程。(只需要考虑子进程的子进程,再往深层次则不考虑)

 

参考答案:

#!/bin/bash

read -p "please input a pid number: " p
ps -elf > /tmp/ps.log

is_ppid(){
    awk '{print $5}' /tmp/ps.log > /tmp/ps1.log
    if ! grep -qw "$1" /tmp/ps1.log
    then
        echo "PID $1 不是系统进程号,或者它不是父进程"
    return 1
    fi
}

is_ppid $p

if [ $? -eq "1" ]
then
    exit
fi

print_cpid(){
    p=$1
    awk -v p1=$p '$5 == p1 {print $4}' /tmp/ps.log |sort -n |uniq >/tmp/p1.log
    n=`wc -l /tmp/p1.log|awk '{print $1}'`
    if [ $n -ne 0 ]
    then
        echo "PID $p 子进程 pid 如下:"
        cat /tmp/p1.log
    else
    echo "PID $p 没有子进程"
    fi
}

print_cpid $p

for cp in `cat /tmp/p1.log`
do
    print_cpid $cp
done

另外,一条命令查询的方法是:pstree -p pid

shell习题-监控cpu使用率


用shell写一个监控服务器cpu使用率的监控脚本。

思路:用top -bn1 命令,取当前空闲cpu百份比值(只取整数部分),然后用100去剑这个数值。

 

参考答案:

#!/bin/bash

while :
do
    idle=`top -bn1 |sed -n '3p' |awk '{print $5}'|cut -d . -f1`
    use=$[100-$idle]
    if [ $use -gt 90 ]
    then 
        echo "cpu use percent too high."
        #发邮件省略
    fi
    sleep 10
done