最新文章:

首页 运维技术

老男孩Shell企业面试题30道附答案

发布时间:2016年09月13日 评论数:抢沙发 阅读数:7164

    企业面试题1:


    (生产实战案例):监控MySQL主从同步是否异常,如果异常,则发送短信或者邮件给管理员。提示:如果没主从同步环境,可以用下面文本放到文件里读取来模拟:

    阶段1:开发一个守护进程脚本每30秒实现检测一次。

    阶段2:如果同步出现如下错误号(1158,1159,1008,1007,1062),则跳过错误。

    阶段3:请使用数组技术实现上述脚本(获取主从判断及错误号部分)


    [root@oldboy~]# mysql -uroot -p'oldboy' -S /data/3307/mysql.sock -e "show slavestatus\G;"

    *************************** 1. row ***************************

                  Slave_IO_State:Waiting for master to send event

                     Master_Host:10.0.0.179   #当前的mysql master服务器主机

                     Master_User: rep

                     Master_Port: 3306

                   Connect_Retry: 60

                 Master_Log_File:mysql-bin.000013

            Read_Master_Log_Pos: 502547

                  Relay_Log_File:relay-bin.000013

                   Relay_Log_Pos:251

           Relay_Master_Log_File:mysql-bin.000013

                Slave_IO_Running:Yes

              Slave_SQL_Running: Yes

                 Replicate_Do_DB:

            Replicate_Ignore_DB: mysql

             Replicate_Do_Table:

         Replicate_Ignore_Table:

        Replicate_Wild_Do_Table:

    Replicate_Wild_Ignore_Table:

                      Last_Errno: 0

                      Last_Error:

                    Skip_Counter: 0

            Exec_Master_Log_Pos: 502547

                 Relay_Log_Space:502986

                 Until_Condition:None

                  Until_Log_File:

                   Until_Log_Pos: 0

             Master_SSL_Allowed: No

             Master_SSL_CA_File:

             Master_SSL_CA_Path:

                 Master_SSL_Cert:

              Master_SSL_Cipher:

                  Master_SSL_Key:

          Seconds_Behind_Master: 0   #和主库比同步延迟的秒数,这个参数很重要

    Master_SSL_Verify_Server_Cert: No

                   Last_IO_Errno: 0

                   Last_IO_Error:

                  Last_SQL_Errno: 0

                  Last_SQL_Error:

    本脚本由李佳豪同学分享


    [root@db02 tmp]# cat MySQL主从监控.sh

    #!/bin/bash

    Mysql="mysql -uroot -poldboy123 -S /data/3307/mysql.sock"

    L_aaa(){

    Status=`$Mysql -e "show slave status\G" | grep -E "_Running: Yes|Seconds_Behind_Master: [0-2]" | wc -l`

    Code=`$Mysql -e "show slave status\G" | awk '/Last_SQL_Errno:/{print $2}'`

    }

    L_Status(){

     [ $Status -ne 3 ] && {

       return 1

     } || {

       return 0

     }

    }

    S_Code=(

    1158

    1159

    1008

    1007

    1062

    )

    L_Skip(){

     [ $Code -eq 0 ] && return 0

     for i in ${S_Code[*]}

       do

         [ $Code -eq $i ] && {

           $Mysql -e "stop slave;set global sql_slave_skip_counter = 1;start slave;" && \

           return 0

         }

     done

     return 1

    }

    main(){

    while true

      do

         L_aaa

         L_Skip

         Error1=$?

         L_Status

         Error2=$?

         [ $Error1 -eq 1 -o $Error2 -eq 1 ] && echo "Error"

    done

    }

    main

    企业面试题2:


    使用for循环在/oldboy目录下通过随机小写10个字母加固定字符串oldboy批量创建10个html文件,名称例如为:


    [root@oldboy oldboy]# sh /server/scripts/oldboy.sh

    [root@oldboy oldboy]# ls

    coaolvajcq_oldboy.html  qnvuxvicni_oldboy.html  vioesjmcbu_oldboy.html

    gmkhrancxh_oldboy.html  tmdjormaxr_oldboy.html  wzewnojiwe_oldboy.html

    jdxexendbe_oldboy.html  ugaywanjlm_oldboy.html  xzzruhdzda_oldboy.html

    qcawgsrtkp_oldboy.html  vfrphtqjpc_oldboy.html

    脚本如下:


    [root@db02 ~]# sh html.sh

    [root@db02 ~]# ls /oldboy/

    aebccciiaj_oldboy.html  fffabecgbc_oldboy.html

    afffebcchb_oldboy.html  ffghcffegb_oldboy.html

    dbccddabbj_oldboy.html  hffbhfgdff_oldboy.html

    ehbdaedach_oldboy.html  jadafhbaaf_oldboy.html

    fbaacihehi_oldboy.html  jgfebjbebd_oldboy.html

    [root@db02 ~]# cat html.sh

    #!/bin/bash

    . /etc/init.d/functions

    [ -d /oldboy ]|| mkdir -p /oldboy

    cd /oldboy

    for i in `seq 10`

    do

       touch `echo $RANDOM|md5sum|cut -c 1-10|tr "[0-9]" "[a-z]"`_oldboy.html

    done

    企业面试题3:


    请用至少两种方法实现!

    将以上文件名中的oldboy全部改成oldgirl(用for循环实现),并且html改成大写。

    第一种方法:


    [root@db02 ~]# sh html1.sh

    [root@db02 ~]# ll /oldboy/

    total 0

    -rw-r--r-- 1 root root 0 Jul 20 20:45 aebccciiaj_oldboy.HTML

    -rw-r--r-- 1 root root 0 Jul 20 20:45 afffebcchb_oldboy.HTML

    -rw-r--r-- 1 root root 0 Jul 20 20:45 dbccddabbj_oldboy.HTML

    -rw-r--r-- 1 root root 0 Jul 20 20:45 ehbdaedach_oldboy.HTML

    -rw-r--r-- 1 root root 0 Jul 20 20:45 fbaacihehi_oldboy.HTML

    -rw-r--r-- 1 root root 0 Jul 20 20:45 fffabecgbc_oldboy.HTML

    -rw-r--r-- 1 root root 0 Jul 20 20:45 ffghcffegb_oldboy.HTML

    -rw-r--r-- 1 root root 0 Jul 20 20:45 hffbhfgdff_oldboy.HTML

    -rw-r--r-- 1 root root 0 Jul 20 20:45 jadafhbaaf_oldboy.HTML

    -rw-r--r-- 1 root root 0 Jul 20 20:45 jgfebjbebd_oldboy.HTML

    [root@db02 ~]# cat html1.sh

    #!/bin/bash

    cd /oldboy

    for i in `cd /oldboy`

    do

      rename "oldboy" "oldgirl" *.html|rename "html" "HTML" *.html

    done

    第二种方法:


    [root@db02 ~]# sh html2.sh

    [root@db02 ~]# ll /oldboy/

    total 0

    -rw-r--r-- 1 root root 0 Jul 20 20:45 aebccciiaj_oldgirl.HTML

    -rw-r--r-- 1 root root 0 Jul 20 20:45 afffebcchb_oldgirl.HTML

    -rw-r--r-- 1 root root 0 Jul 20 20:45 dbccddabbj_oldgirl.HTML

    -rw-r--r-- 1 root root 0 Jul 20 20:45 ehbdaedach_oldgirl.HTML

    -rw-r--r-- 1 root root 0 Jul 20 20:45 fbaacihehi_oldgirl.HTML

    -rw-r--r-- 1 root root 0 Jul 20 20:45 fffabecgbc_oldgirl.HTML

    -rw-r--r-- 1 root root 0 Jul 20 20:45 ffghcffegb_oldgirl.HTML

    -rw-r--r-- 1 root root 0 Jul 20 20:45 hffbhfgdff_oldgirl.HTML

    -rw-r--r-- 1 root root 0 Jul 20 20:45 jadafhbaaf_oldgirl.HTML

    -rw-r--r-- 1 root root 0 Jul 20 20:45 jgfebjbebd_oldgirl.HTML

    [root@db02 ~]# cat html2.sh

    #!/bin/bash

    cd /oldboy

    for i in `ls *.HTML`

    do

    mv $i `echo $i|sed -e 's#oldboy#oldgirl#g;s#html#HTML#g'`

    done

    补充:QQ 1163718639


    [root@db01 shell30]# cat 3.sh

    #!/bin/bash

    for i in /oldboy/* do rename oldboy. oldgir. $i|echo oldgirlok done for x in /oldboy/* do rename html HTML $x|echo htmlok done

    [root@db01 shell30]#

    企业面试题4:


    批量创建10个系统帐号oldboy01-oldboy10并设置密码(密码为随机8位字符串)。


    [root@db02 tmp]# cat useradd.sh

    #!/bin/bash

    [ $UID -ne 0 ]&& echo "only root run"&&exit 1

    [ -f /etc/init.d/functions ]&& . /etc/init.d/functions

    isexist() {

     result=$(grep -w "^$1" /etc/passwd|wc -l)

     if [ $result -ne 0  ];then

       echo "user $1 is exist!!"

       ret 1 "create user is  "

       continue

     fi

    }

    ret() {

     if [ $1 -eq 0 ];then

       action "$2" /bin/true

     else

       action "$2" /bin/false

     fi

    }

    create() {

     for i in $(seq -w 10)

     do

       user="oldboy$i"

       isexist $user

       pass=$(cat /proc/sys/kernel/random/uuid|md5sum|cut -c 1-10)

       useradd $user&&echo $pass|passwd --stdin $user &>/dev/null

       ret $? "crate user $user"

       echo "$user $pass" >> /tmp/user.list

     done

    }

    main() {

     create

    }

    main

    企业面试题5:


    写一个脚本,实现判断10.0.0.0/24网络里,当前在线用户的IP有哪些(方法有很多)

    本脚本由刘沈晨分享

    注意:此脚本使用nmap,如果没有需要使用yum -y install nmap


    [root@db02 scripts]# cat test_5.sh

    #!/bin/sh

    #

    [ -f /etc/init.d/functions ] && . /etc/init.d/functions

    function IP_count(){

     for n in 10.0.0.{0..255}

      do

       IP_check=`nmap -sP $n|grep "Host is up"|wc -l`

       if [ ${IP_check} -eq 1 ];then

         action "$n" /bin/true

         let i+=1

       fi

     done

    }

    function main(){

     IP_count

     echo "The total number of online IP Addresses is " $i

    }

    main

    企业实战题6:


    写一个脚本解决DOS攻击生产案例

    提示:根据web日志或者或者网络连接数,监控当某个IP并发连接数或者短时内PV达到100,即调用防火墙命令封掉对应的IP,监控频率每隔3分钟。防火墙命令为:iptables -I INPUT -s 10.0.1.10 -j DROP。

    本脚本使用测试文件进行编写:模拟文件下载 链接:http://pan.baidu.com/s/1gfqeHaz 密码:3usn


    [root@db02 scripts]# cat test_6.sh

    #!/bin/sh

    #

    [ -f /etc/init.d/functions ] && . /etc/init.d/functions

    IP_file="/server/scripts/ddos.txt"

    IP_filter_command="iptables -I INPUT -j DROP -s"

    IP_recover_command="iptables -D INPUT -j DROP -s"

    function IP_check(){

     grep "EST"  ${IP_file}|awk -F "[ |:]+" '{print $6}'|sort |uniq -c|sort -rn -k1 > /server/scripts/ip.txt

    }

    function IP_filter(){

      exec < /server/scripts/ip.txt

      while read line

      do

        IP_count=`echo $line|awk '{print $1}'`

        IP=`echo $line|awk '{print $2}'`

        IP_fil=`iptables -L -n|grep "\b${IP}\b"|wc -l`

        if [ ${IP_count} -gt 25 -a ${IP_fil} -eq 0 ];then

           ${IP_filter_command} ${IP}

           echo "${IP}" >> /server/scripts/ip_filtered.txt

           action "Filter ${IP}" /bin/true

        fi

      done

    }

    function IP_recover(){

      exec < /server/scripts/ip.txt

      while read line

      do

        IP_count=`echo $line|awk '{print $1}'`

        IP=`echo $line|awk '{print $2}'`

        IP_fil=`iptables -L -n|grep "\b${IP}\b"|wc -l`

        if [ ${IP_count} -le 25 -a ${IP_fil} -eq 1 ];then

           ${IP_recover_command} ${IP}

           echo "${IP}" >> /server/scripts/ip_filtered.txt

           action "Recover ${IP}" /bin/true

        fi

      done

    }

    function main(){

       case "$1" in

         filter)

         IP_check

         echo "$(date +%F-%H:%M:%S) filtered by $(whoami)" >> /server/scripts/ip_filtered.txt

         IP_filter

         ;;

         recover)

         IP_check

         echo "$(date +%F-%H:%M:%S) recovered by $(whoami)" >> /server/scripts/ip_filtered.txt

         IP_recover

         ;;

         *)

         echo "USAGE:$0 {filter|recover}"

         exit 1

       esac

    }

    main $*

    企业实战题7:


    开发mysql多实例启动脚本:

    已知mysql多实例启动命令为:mysqld_safe--defaults-file=/data/3306/my.cnf &

    停止命令为:mysqladmin -u root -poldboy123 -S /data/3306/mysql.sockshutdown

    请完成mysql多实例启动启动脚本的编写

    要求:用函数,case语句、if语句等实现


    1.第一种方法:比较简单,适用于一台MySQL服务器上

    [root@db02 mysql]# cat mysql.sh

    #!/bin/bash

    ###########################

    #I am YuhongCong

    #qq:604419314

    ##########################

    [ -f /etc/init.d/functions ]&& . /etc/init.d/functions

    #config

    prot=3306

    mysql_user=root

    mysql_paswd=123456

    Path=/data/3306/

    mysql_start(){

     if [ -f ${Path}mysqld.pid ];then

       echo "MySQL is running"

       exit 1

     else

       mysqld_safe --defaults-file=${Path}my.cnf &>/dev/null &

       if [ $? -eq 0 ];then

       action "MySQL is starting" /bin/true

       else

       action "MySQL no start" /bin/false

       fi

     fi

    }

    mysql_stop(){

     if [ ! -f ${Path}mysqld.pid ];then

       echo "Mysql not running"

     else

       mysqladmin -u ${mysql_user} -p${mysql_paswd} -S ${Path}mysql.sock shutdown

       if [ $? -eq 0 ];then

       action "mysql is stop" /bin/true

       else

       action "mysql no stop" /bin/false

       fi

     fi

    }

    case "$1" in

    start)

     mysql_start

       ;;

    stop)

     mysql_stop

       ;;

    restart)

     mysql_stop

     sleep 3

     mysql_start

       ;;

    *)

     echo "Please input {start|stop|restart}"

       ;;

    esac

    第二种方法:应强哥及李啸宇、大欣等要求进行改版。

    适用于管理多实例启动的脚本


    [root@db02 tmp]# cat mysqlgood.sh

    #!/bin/bash

    ##################

    #I am yuhongcong

    #qq:604419314

    #################

    [ -f /etc/init.d/functions ]&& . /etc/init.d/functions

    prot=3306

    mysql_user=root

    mysql_paswd=123456

    Path=/data/3306/

    #############################################

    cat <<END

    ############################

    #    3306

    #    3307

    #    exit

    ###########################

    END

    read -p  "Please input {3306|3307}" a

    mysql1_start(){

     if [ -f ${Path}mysqld.pid ];then

       echo "MySQL is runningx"

     else

       mysqld_safe --defaults-file=${Path}my.cnf &>/dev/null &

       if [ $? -eq 0 ];then

         action "mysql 3306 is starting" /bin/true

       else

         action "mysql 3306 not start" /bin/false

       fi

     fi

    }

    mysql1_stop(){

     if [ ! -f ${Path}mysqld.pid ];then

       echo "mysql 3306 not running"

     else

       mysqladmin -u ${mysql_user} -p${mysql_paswd} -S /data/3306/mysql.sock shutdown

        if [ $? -eq 0 ];then

       action "mysql 3306 is stopping" /bin/true

        else

       action "mysql 3306 no stop" /bin/false

        fi

     fi

    }

    mysql2_start(){

     if [ -f /data/3307/mysqld.pid ];then

       echo "MySQL 3307 is runningx"

     else

       mysqld_safe --defaults-file=/data/3307/my.cnf &>/dev/null &

       if [ $? -eq 0 ];then

         action "mysql 3307 is starting" /bin/true

       else

         action "mysql 3307 not start" /bin/false

       fi

     fi

    }

    mysql2_stop(){

     if [ ! -f /data/3307/mysqld.pid ];then

       echo "mysql 3307 not running"

     else

       mysqladmin -u ${mysql_user} -p${mysql_paswd} -S /data/3307/mysql.sock shutdown

        if [ $? -eq 0 ];then

       action "mysql 3307 is stopping" /bin/true

        else

       action "mysql 3307 no stop" /bin/false

        fi

     fi

    }

    aaa(){

    cat <<END

    ###########################

    #    1.start

    #    2.stop

    #    3.restart

    #    4.exit

    ###########################

    END

    read -p "please input {1|2|3|4}" b

    }

    bbb(){

    cat <<END

    ###########################

    #    1.start

    #    2.stop

    #    3.restart

    #    4.exit

    ###########################

    END

    read -p "please input {1|2|3|4}" c

    }

    case "$a" in

    3306)

       aaa

    ;;

    3307)

       bbb

    ;;

    exit)

       exit

    ;;

    esac

    case "$b" in

    1)

     mysql1_start

    ;;

    2)

     mysql1_stop

    ;;

    3)

     mysql1_stop

     sleep 3

     mysql1_start

    ;;

    4)

     exit 2

    ;;

    esac

    case "$c" in

    1)

     mysql2_start

    ;;

    2)

     mysql2_stop

    ;;

    3)

     mysql2_stop

     sleep 3

     mysql2_start

    ;;

    4)

     exit 2

    ;;

    esac

    企业实战题8:


    如何实现对MySQL数据库进行分库备份,请用脚本实现

    本文由刘康同学提供


    [root@db02 tmp]# cat MoreDatabasesBak.sh

    #!/bin/bash

    . /etc/init.d/functions

    PORT='3306'

    BAKUPDIR='/server/backup'

    MYSQLUSER='root'

    MYSQLPASS='oldboy'

    SOCK="/data/${PORT}/mysql.sock"

    CMDDIR="/application/mysql/bin"

    MYSQL="${CMDDIR}/mysql -u${MYSQLUSER} -p${MYSQLPASS} -S${SOCK}"

    DBNAME=`${MYSQL} -e "show databases;"|sed 1d|egrep -v "_schema|mysql"`

    AYYAYDB=($DBNAME)

    MYSQLDUMP="${CMDDIR}/mysqldump -u${MYSQLUSER} -p${MYSQLPASS} -S${SOCK}"

    function BAKDB(){

       for((n=0;n<${#AYYAYDB[*]};n++))

              do

           ${MYSQLDUMP} --events -B ${AYYAYDB[$n]} |gzip >${BAKUPDIR}/${AYYAYDB[$n]}_$(date +%T-%F)_bak.sql.gz

           RETVAL=$?

           if [ $RETVAL -eq 0 ]

               then

                   echo "${AYYAYDB[$n]} bak successfull `date +%F-%T` " >>/tmp/DBbakstatus.log

               else

                   echo "${AYYAYDB[$n]} bak fail `date +%F-%T` " >>/tmp/DBbakstatus.log

           fi    

              done

       mail -s "DB STATUS" www.abcdocker.com@qq.com < /tmp/DBbakstatus.log

       return

    }

    function DBstatus(){

    [ -d ${BAKUPDIR} ] || mkdir ${BAKUPDIR} -p

    ${MYSQL} -e "show full processlist;" &> /dev/null

    RETVAL=$?

    if [ $RETVAL -eq 0 ]

     then

           >/tmp/DBbakstatus.log

           BAKDB

     else

          echo "DB BAD!!!  `date +%F-%T`" | mail -s "DB BAD!!!" www.abcdocker.com@qq.com

           exit

    fi

    }

    DBstatus

    企业实战题9:


    如何实现对MySQL数据库进行分库加分表备份,请用脚本实现

    本脚本还是由刘康同学提供


    [root@db02 tmp]# cat MoreTablesBak.sh

    #!/bin/bash

    . /etc/init.d/functions

    PORT='3306'

    BAKUPDIR='/server/backup'

    MYSQLUSER='root'

    MYSQLPASS='oldboy'

    SOCK="/data/${PORT}/mysql.sock"

    CMDDIR="/application/mysql/bin"

    MYSQL="${CMDDIR}/mysql -u${MYSQLUSER} -p${MYSQLPASS} -S${SOCK}"

    DBNAME=`${MYSQL} -e "show databases;"|sed 1d|egrep -v "_schema|mysql"`

    AYYAYDB=($DBNAME)

    MYSQLDUMP="${CMDDIR}/mysqldump -u${MYSQLUSER} -p${MYSQLPASS} -S${SOCK}"

    function BAKDB(){

    DBNAME=`${MYSQL} -e "show databases;"|sed 1d|egrep -v "_schema|mysql"`

    AYYAYDB=($DBNAME)

       for((n=0;n<${#AYYAYDB[*]};n++))

              do

       TABLE_BAK_DIR="${BAKUPDIR}/${AYYAYDB[$n]}"

       TABLENAME=`${MYSQL} -e "show tables from ${AYYAYDB[$n]};"|sed 1d`

       ARRAYTABLE=(${TABLENAME})

           for((i=0;i<${#ARRAYTABLE[*]};i++))

               do

           [ -d ${TABLE_BAK_DIR}  ] || mkdir ${TABLE_BAK_DIR} -p

           ${MYSQLDUMP} ${AYYAYDB[$n]} ${ARRAYTABLE[$i]} |gzip >${TABLE_BAK_DIR}/${ARRAYTABLE[$i]}_$(date +%T-%F)_bak.sql.gz

           RETVAL=$?

           if [ $RETVAL -eq 0 ]

               then

                   echo "${AYYAYDB[$n]}_${ARRAYTABLE[$i]} bak successfull `date +%F-%T` " >>/tmp/DB_table_bakstatus.log

               else

                   echo "${AYYAYDB[$n]}_${ARRAYTABLE[$i]} bak fail `date +%F-%T` " >>/tmp/DB_table_bakstatus.log

           fi

           done

              done

       mail -s "DB STATUS" www.abcdocker.com@qq.com < /tmp/DB_table_bakstatus.log

       return

    }

    function DBstatus(){

    [ -d ${BAKUPDIR} ] || mkdir ${BAKUPDIR} -p

    ${MYSQL} -e "show full processlist;" &> /dev/null

    RETVAL=$?

    if [ $RETVAL -eq 0 ]

     then

           >/tmp/DB_table_bakstatus.log

           BAKDB

     else

          echo "DB BAD!!!  `date +%F-%T`" | mail -s "DB BAD!!!" www.abcdocker.com@qq.com

           exit

    fi

    }

    DBstatus

    企业面试题10:


    请用至少两种方法实现!

    bash for循环打印下面这句话中字母数不大于6的单词(昆仑万维面试题)。

    I am oldboy teacher welcome to oldboy training class.


    没讲数组之前自己做的:

    [root@web02 ~]# cat /server/scripts/28/bash.sh

    #!/bin/bash

    for n in `echo I am oldboy teacher welcome to oldboy training class.`

    do

    AAA=$( echo $n|wc -c)

    if [ $AAA -gt 7 ];then

        continue;

    fi

    echo $n

    done

    第一种方法:不使用数组


    [root@db02 scripts]# cat 3.sh

    #!/bin/bash

    for i in I am oldboy teacher welcome to oldboy training class.

    do

      if [ "${#i}" -le 6 ]

        then

           echo $i

      fi

    done

    第二种方法:使用数组


    [root@db02 scripts]# cat 3.sh

    #!/bin/bash

    array=(I am oldboy teacher welcome to oldboy training class.)

    for ((i=0;i<${#array[@]};i++))

    do

      if [ "`echo ${array[i]}|wc -L`" -le 6 ]

      then

          echo ${array[i]}

      fi

    done

    第三种方法:命令拼接


    echo "I am oldboy teacher welcome to oldboy training class." | awk '{for(i=1;i<=NF;i++){a=length($i);if(a <= 6){print $i}}}'

    企业面试题11:


    开发shell脚本分别实现以脚本传参以及read读入的方式比较2个整数大小。以屏幕输出的方式提醒用户比较结果。注意:一共是开发2个脚本。当用脚本传参以及read读入的方式需要对变量是否为数字、并且传参个数做判断。


    [root@db01 scripts]# cat read.sh

    #!/bin/sh

    #no.1

    read -p "Pls input two num:" a b

    [ -z "$a" -o -z "$b" ]&&{

      echo "must be two num."

      exit 1

    }

    #no.2

    expr $a + 1 &>/dev/null

    [ $? -ne 0 ]&&{

       echo "First arg must be int."

       exit 2

    }

    expr $b + 1 &>/dev/null

    [ $? -ne 0 ]&&{

       echo "Second arg must be int."

       exit 3

    }

    #no.3

    [ $a -gt $b ]&&{

     echo "$a > $b"

     exit 0

    }

    [ $a -eq $b ]&&{

     echo "$a = $b"

     exit 0

    }

    [ $a -lt $b ]&&{

     echo "$a < $b"

     exit 0

    }

    企业面试题12:


    打印选择菜单,一键安装Web服务:


    [root@oldboyscripts]# sh menu.sh

       1.[install lamp]

       2.[install lnmp]

       3.[exit]

       pls input the num you want:

    要求:

    1、当用户输入1时,输出“startinstalling lamp.”然后执行/server/scripts/lamp.sh,脚本内容输出"lampis installed"后退出脚本;

    2、当用户输入2时,输出“startinstalling lnmp.”然后执行/server/scripts/lnmp.sh输出"lnmpis installed"后退出脚本;

    3、当输入3时,退出当前菜单及脚本;

    4、当输入任何其它字符,给出提示“Input error”后退出脚本。

    5、要对执行的脚本进行相关条件判断,例如:脚本是否存在,是否可执行等。

    由10组黑哥提供(吴依)

    黑哥博客:www.dockerwy.com


    #!/bin/bash

    cat <<EOF

    1.[install lamp]

    2.[install lnmp]

    3.[exit]

    pls input the num you want:

    EOF

    read -p "please input number 1-3:" a

    lamp() {

     if [ -f /server/scripts/lamp.sh ];then

    echo "startinstalling lamp."

    sleep 2

    sh /server/scripts/lamp.sh

    else

    echo "file does not exist"

     fi

    exit 0

    }

    lnmp () {

     if [ -f /server/scripts/lnmp.sh ];then

    echo "startinstalling lnmp."

    sleep 3

    sh /server/scripts/lnmp.sh

    else

    echo "file does not exist"

     fi

    exit 0

    }

    case $a in

     1)

    lamp

    ;;

     2)

    lnmp

    ;;

     3)

    exit 0

    ;;

     *)

    echo "pls input the num you want:"

    ;;

    esac

    企业面试题13:


    1、监控web服务是否正常,不低于3种监控策略。

    2、监控db服务是否正常,不低于3种监控策略。

    要求间隔1分钟,持续监控。

    思路

    1、监控的三种方式

    通过进程名监控 ps -ef|grep name

    通过端口监控 netstat -lntup|grep port/lsof -i:80

    通过链接信息上的进程名 netstat -lntup|grep port

    2、等待一分钟

    3、后台执行 nohup


    #!/bin/bash

    [ -f /etc/init.d/functions ] && . /etc/init.d/functions

    check_httpd(){

    count=`ps -ef|grep nginx|grep -v grep|wc -l`

         if [ "$count" -ne 0 ]

         then

           action "nginx is ok" /bin/true

         else

           action "nginx is dead" /bin/false

         fi

       }

       check_httpd_port(){

         count=`netstat -lntup|grep 8080|wc -l`

         if [ "$count" -ne 0 ]

         then

           action "nginx is ok" /bin/true

         else

           action "nginx is dead" /bin/false

         fi

       }

    企业面试题14:


    监控memcache服务是否正常,模拟用户(web客户端)检测。

    使用nc命令加上set/get来模拟检测,以及监控响应时间及命中率。

    感谢乔飞翔同学的分享


    [root@db02 scripts]# cat mem.sh

    #!/bin/bash

    ########################

    #date:2016-07-17       #

    #author:fxqiao         #

    #QQ:827724746          #

    #E-mail:qfx1995@163.com#

    ########################

    #echo -ne "\033[0;33m"

    echo -ne "\E[1;32m"

    cat<<EOT

                                     _oo0oo_

                                    088888880

                                    88" . "88

                                    (| -_- |)

                                     0\ = /0

                                  ___/'---'\___

                                .' \\\\|     |// '.

                               / \\\\|||  :  |||// \\

                              /_ ||||| -:- |||||- \\

                             |   | \\\\\\  -  /// |   |

                             | \_|  ''\---/''  |_/ |

                             \  .-\__  '-'  __/-.  /

                           ___'. .'  /--.--\  '. .'___

                        ."" '<  '.___\_<|>_/___.' >'  "".

                       | | : '-  \'.;'\ _ /';.'/ - ' : | |

                       \  \ '_.   \_ __\ /__ _/   .-' /  /

                   ====='-.____'.___ \_____/___.-'____.-'=====

                                     '=---='

                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

                           佛祖保佑    iii    服务正常

    EOT

    echo -ne "\E[0m"

    [ -f /etc/init.d/functions ] && . /etc/init.d/functions

    ###variables

    RETVAL=0

    ###color

    RED_COLOR='\E[1;31m'

    GREEN_COLOR='\E[1;32m'

    YELLOW_COLOR='\E[1;33m'

    BLUE_COLOR='\E[1;34m'

    RES='\E[0m'

    ####menu list

    menu() {

    cat <<EOF

    ############################

     1 memcached status

     2 memcached stop

     3 memcached get_hits

     4 quit

    EOF

    }

    status() {

    Set=$(printf "set key1 0 0 6\r\noldboy\r\n"|nc 127.0.0.1 11211|grep STORED|wc -l)

    Get=$(printf "get key1\r\n"|nc 127.0.0.1 11211|grep oldboy|wc -l)

    Port=$(netstat -lntup|grep memcached|wc -l)

     if [ $Port -ge 4 ];then

        Num=$(expr $Set + $Get)

        if [ $Num -eq 2 ];then

           action "Memcached server is running" /bin/true

        else

           action "Memcached server is not normal" /bin/false

        fi

     else

        action "Memcached server is not running" /bin/false

        read -t 10 -p "Memcached server whether open:






    :" b

        if [ "$b" == "y" -o "$b" == "Y" ];then

           /usr/bin/memcached -m 16m -p 11211 -d -u root -c 8192

           action "Memcached server is starting" /bin/true

        elif [ "$b" == "n" -o "$b" == "N" ];then

           echo -e "$YELLOW_COLOR Goodbye.............$RES"

        fi

     fi

     return $RETVAL

    }

    stop() {

    Port=$(netstat -lntup|grep memcached|wc -l)

     if [ $Port -ge 4 ];then

        pkill memcached &>/dev/null

        RETVAL=$?

        if [ $RETVAL -eq 0 ];then

           action "Memcached server is stopping" /bin/true

        else

           action "Memcached server is stopping" /bin/false

        fi

     else

        action "Memcached server not running" /bin/false

     fi

    }

    get_hits() {

    Cmd_get=$(printf "stats\r\n"|nc 127.0.0.1 11211|grep "cmd_get"|awk '{print $3}')

    Get_hits=$(printf "stats\r\n"|nc 127.0.0.1 11211|grep "get_hits"|awk '{print $3}')

    Get_misses=$(printf "stats\r\n"|nc 127.0.0.1 11211|grep "get_misses"|awk '{print $3}')

    Port=$(netstat -lntup|grep memcached|wc -l)

     if [ $Port -ge 4 ];then

        echo "A total of cmd_get is $Cmd_get"

        sleep 1

        echo "A total of get_hits is $Get_hits"

        sleep 1

        echo "A total of get_misses is $Get_misses"

     else

        action "Memcached is not running" /bin/false

     fi

     return $RETVAL

    }

    main() {

    while true

    do

    menu

    read -t 10 -p "Please input number:" a

    expr $a + 1 &>/dev/null

    if [ $? -ne 0 ];then

      echo -e "$BLUE_COLOR Please input error,not int $RES"

      exit 1

    fi

    case "$a" in

     1)

       status

       RETVAL=$?

       ;;

     2)

       stop

       RETVAL=$?

       ;;

     3)

       get_hits

       RETVAL=$?

       ;;

     4)

       clear

           echo "##############################################"

       echo -e "$GREEN_COLOR `figlet GoodBye` $RES"

       echo "##############################################"

       exit 0

       ;;

     *)

       echo -e "$RED_COLOR input error $RES"

    esac

    done

    }

    main

    exit $RETVAL

    企业面试题15:


    面试及实战考试题:监控web站点目录(/var/html/www)下所有文件是否被恶意篡改(文件内容被改了),如果有就打印改动的文件名(发邮件),定时任务每3分钟执行一次(10分钟时间完成)。


    [root@db02 tmp]# cat html.sh

    #!/bin/sh

    html_dir=/var/html/www

    html_file=`find /var/html/www -type f`

    check_dir=/tmp/checkdir

    [ ! -d $check_dir ] && mkdir $check_dir

    for n in $html_file

    do

     md5sum $n >>$check_dir/1.txt

    done

    while true

    do

     md5sum -c $check_dir/1.txt|grep FAILED >>$check_dir/2.txt

     [ -s $check_dir/2.txt ] && \

     echo "`cat $check_dir/2.txt`"|mail -s "date:`date +%F-%H:%M:%S` Web is dangerous" 18576749166@163.com

     >$check_dir/2.txt

    sleep 3

    done

    企业面试题16:


    企业案例:写网络服务独立进程模式下rsync的系统启动脚本

    例如:/etc/init.d/rsyncd{start|stop|restart}。

    要求:

    1.要使用系统函数库技巧。

    2.要用函数,不能一坨SHI的方式。

    3.可被chkconfig管理。


    [root@www tmp]# cat 123.sh

    #!/bin/bash

    ##################

    #I am yuhongcong

    #qq:604419314

    #################

    # Comments to support chkconfig on RedHat Linux

    # chkconfig: 2345 64 36

    status1=$(ps -ef | egrep "rsync --daemon.*rsyncd.conf" | grep -v 'grep')

    pidfile="/etc/rsync/rsyncd.pid"

    start_rsync="rsync --daemon --config=/etc/rsync/rsyncd.conf"

    function rsyncstart() {

       if [ "${status1}X" == "X" ];then

           rm -f $pidfile      

           ${start_rsync}  

           status2=$(ps -ef | egrep "rsync --daemon.*rsyncd.conf" | grep -v 'grep')

           if [  "${status2}X" != "X"  ];then

               echo "rsync service start.......OK"

           fi

       else

           echo "rsync service is running !"  

       fi

    }

    function rsyncstop() {

       if [ "${status1}X" != "X" ];then

           kill -9 $(cat $pidfile)

           status2=$(ps -ef | egrep "rsync --daemon.*rsyncd.conf" | grep -v 'grep')

           if [ "${statusw2}X" == "X" ];then

               echo "rsync service stop.......OK"

           fi

       else

           echo "rsync service is not running !"  

       fi

    }

    function rsyncstatus() {

       if [ "${status1}X" != "X" ];then

           echo "rsync service is running !"  

       else

            echo "rsync service is not running !"

       fi

    }

    function rsyncrestart() {

       if [ "${status1}X" == "X" ];then

                  echo "rsync service is not running..."

                  rsyncstart

           else

                  rsyncstop

                  rsyncstart  

           fi      

    }

    case $1 in

           "start")

                  rsyncstart

                   ;;

           "stop")

                  rsyncstop

                   ;;

           "status")

                  rsyncstatus

                  ;;

           "restart")

                  rsyncrestart

                  ;;

           *)

             echo

                   echo  "Usage: $0 start|stop|restart|status"

             echo

    esac

    企业面试题17:


    老男孩教育天津项目学生实践抓阄题目:

    好消息,老男孩培训学生外出企业项目实践机会(第6次)来了(本月中旬),但是,名额有限,队员限3人(班长带队)。

    因此需要挑选学生,因此需要一个抓阄的程序:

    要求:

    1、执行脚本后,想去的同学输入英文名字全拼,产生随机数01-99之间的数字,数字越大就去参加项目实践,前面已经抓到的数字,下次不能在出现相同数字。

    2、第一个输入名字后,屏幕输出信息,并将名字和数字记录到文件里,程序不能退出继续等待别的学生输入。


    [root@db02 tmp]# cat select17.sh

    #!/bin/sh

    > /tmp/temp.txt

    input(){

    while true

    do

     read -p "pls input your name:" name

     if [ -z $name ]

     then

       continue

     elif [ $name == "0" ]

     then

       break

     fi

     rand=$((RANDOM%100))

     echo -e $rand"\t"$name >>/tmp/temp.txt

    done

    }

    output(){

    cat /tmp/temp.txt |sort -n -k1 -r|sed '3a#################'

    }

    main(){

    input

    output

    }

    main

    企业面试题18:


    已知下面的字符串是通过RANDOM随机数变量md5sum|cut-c 1-8截取后的结果,请破解这些字符串对应的md5sum前的RANDOM对应数字?


    21029299

    00205d1c

    a3da1677

    1f6d12dd

    890684b

    方法一:


    #!/bin/bash

    . /etc/init.d/functions

    MD5PASS=(

    21029299

    00205d1c

    a3da1677

    1f6d12dd

    890684b

    )

    for ((n=0;n<=32767;n++))

    do

    for((i=0;i<${#MD5PASS[*]};i++))

    do

           md5=`echo $n | md5sum|cut -c 1-8`

           if [ "$md5" == ${MD5PASS[$i]} ]

                   then

                   echo "$n" "${MD5PASS[$i]} "

                   fi

    done

    done

    方法二:


    [root@openvpn-server ~]# cat md5sum.sh

    #!/bin/sh

    a=(

    21029299

    00205d1c

    a3da1677

    1f6d12dd

    890684b

    )

    for i in `seq 32767`

    do

      source=`echo $i|md5sum|cut -c 1-8`

      for j in ${a[@]}

      do

      if [ $source == $j ];then

         echo $source "-->" $i

      fi

      done

    done

    方法三:


    [root@m01 ~]# cat mianshiti6.sh

    #!/bin/bash

    mima=(

    21029299

    00205d1c

    a3da1677

    1f6d12dd

    890684b

    )

    for i in {1..32767}

    do

     num=`echo $i | md5sum | cut -c -8`

     for n in ${mima[*]}

      do

       if [ "$num" == "$n"  ]

        then

         echo "$i match $n"

         continue

       fi

     done

    done

    企业面试题19:


    批量检查多个网站地址是否正常

    要求: shell数组方法实现,检测策略尽量模拟用户访问思路

    http://www.etiantian.org

    http://www.taobao.com

    http://oldboy.blog.51cto.com

    http://10.0.0.7


    [root@db02 scripts]# cat aaa.sh

    #!/bin/sh

    ################

    #Author:YuHongCong

    #604419314@qq.com

    ################

    [ -f /etc/init.d/functions ] && . /etc/init.d/functions

    URLS=(

    http://www.etiantian.org

    http://www.taobao.com

    http://oldboy.blog.51cto.com

    http://10.0.0.70

    )

    CHECK_URL(){

     wget -T 3 --spider --tries=2 $1 &>/dev/null

     if [ $? -eq 0 ]

     then

       return 0

     else

       return 1

     fi

    }

    MON_URL(){

    for url in ${URLS[*]}

    do

     CHECK_URL $url

     if [ $? -eq 0 ]

     then

       action "$url" /bin/true

     else

       action "$url" /bin/false

     fi

    done

    }

    main(){

    while true

    do

     MON_URL

     sleep 10

    done

    }

    main

    1.png-178kB

    老男孩推荐:(包含倒计时的方法)


    [root@db01 shizhan]# cat oldboy01.sh  

    #!/bin/sh

    ################

    #Author:oldboy

    #31333741@qq.com

    ################

    [ -f /etc/init.d/functions ] && . /etc/init.d/functions

    URLS=(

    http://www.etiantian.org

    http://www.taobao.com

    http://oldboy.blog.51cto.com

    http://10.0.0.70

    )

    LTIME(){

    echo -n "time;"

    for n in {1..10}

    do

     if [ $n -eq 10 ]

      then

       echo "start"

     else

       echo -n .

     fi

     sleep 1

    done

    }

    CHECK_URL(){

     wget -T 3 --spider --tries=2 $1 &>/dev/null

     if [ $? -eq 0 ]

     then

       return 0

     else

       return 1

     fi

    }

    MON_URL(){

    for url in ${URLS[*]}

    do

     CHECK_URL $url

     if [ $? -eq 0 ]

     then

       action "$url" /bin/true

     else

       action "$url" /bin/false

     fi

    done

    }

    main(){

    while true

    do

     LTIME

     MON_URL

     sleep 10

    done

    }

    main

    企业面试题20(中企动力):


    用shell处理以下内容

    1、按单词出现频率降序排序!

    2、按字母出现频率降序排序!


    the squid project provides a number of resources toassist users design,implement and support squid installations. Please browsethe documentation and support sections for more infomation

    #!/bin/sh

    str="the squid project provides a number of resources toassist users design,implement and support squid installations. Please browsethe documentation and support sections for more infomation"

    words(){

    echo $str|sed 's#[^a-zA-Z]# #g'|tr " " "\n"|grep -v "^$"|sort|uniq -c|sort -r -n

    }

    letters(){

    echo $str|grep -o "."|sort|egrep -v " |^$|[^a-zA-Z]"|uniq -c|sort -n -r

    }

    case $1 in

    words)

     words

     ;;

    letters)

     letters

     ;;

    *)

     echo "usage:$0 {words|letters}"

    esac

    企业面试题22:


    开发通过web界面展示监控Nginx代理节点状态,效果图如下。

    2.png-376.9kB

    文件打包 密码:xso0

    脚本及内容请下载

    3.png-7.9kB


    lvs+keepalived集群部分Shell企业案例:


    企业面试题23、


    【LVS主节点】手工开发ipvsadm管理lvs的脚本ip_vs


    实现:/etc/init.d/lvs {start|stop|restart}


    [root@www tmp]# cat lvs.sh

    #!/bin/bash

    if [ $UID -ne 0 ];then

     echo "Permission denied (you must be root)"

     exit 1

    fi

    [ -f /etc/init.d/functions ] && . /etc/init.d/functions

    vip_netmask=10.0.0.3/24

    vip=10.0.0.3

    service_addr=10.0.0.3:80

    rs=(

    10.0.0.7:80

    10.0.0.8:80

    )

    start() {

       #add vip

       ifconfig|grep $vip &>/dev/null

       if [ $? -ne 0 ];then

         ip addr add $vip_netmask dev eth0 label eth0:0 && \

         action "add vip $vip_netmask" /bin/true

       else

         echo "vip $vip_netmask already exists."

       fi

       lvs_table=$(ipvsadm -ln|grep "$vip"|wc -l)

       if [ $lvs_table -eq 1 ];then

         echo "virtual server already exists."

       else

         #add virtual server

         ipvsadm -A -t $service_addr -s wrr && \

         action "add virtual server $service_addr" /bin/true

       fi

       for ip in ${rs[@]};do

         rs_num=$(ipvsadm -ln|grep "$ip"|wc -l)

         if [ $rs_num -eq 1 ];then

           echo "real server $ip already exists."

         else

           #add real server

           ipvsadm -a -t $service_addr -r $ip -g -w 1 && \

           action "add real server $ip" /bin/true

         fi

       done

       #set tcp tcpfin udp connection timeout

       ipvsadm --set 30 5 60 && \

       action "set tcp tcpfin udp connection timeout values." /bin/true

    }

    stop() {

       ifconfig|grep $vip &>/dev/null

       if [ $? -ne 0 ];then

         echo "without vip $vip"

       else

         #delete vip

         ip addr del $vip_netmask dev eth0 label eth0:0 && \

         action "delete vip $vip_netmask." /bin/true

       fi

       lvs_table=$(ipvsadm -ln|grep "$vip"|wc -l)

       for ip in ${rs[@]};do

         rs_num=$(ipvsadm -ln|grep "$ip"|wc -l)

         let lvs_table+=rs_num

       done

       if [ $lvs_table -ge 1 ];then

         #clear all table

         ipvsadm -C && \

         action "clear all lvs table." /bin/true

       else

         echo "lvs table is empty."

       fi

    }

    case "$1" in

       start)

       start

       ;;

       stop)

       stop

       ;;

       restart)

       stop

       sleep 2

       start

       ;;

       *)

       echo "USAGE: $0 {start|stop|restart}"

    esac

    企业面试题24


    【LVS主节点】模拟keepalived健康检查功能管理LVS节点,

    当节点挂掉(检测2次,间隔2秒)从服务器池中剔除,好了(检测2次,间隔2秒)加进来

    提示:利用ipvsadm命令实现添加和减少LVS节点。


    [root@www tmp]# cat lvs_check_rs.sh

    #!/bin/bash

    vip=10.0.0.3

    rs_ip=(

    10.0.0.8

    10.0.0.7

    )

    remove_check() {

     for rs in ${rs_ip[@]};do

       ipvsadm -ln|grep $rs &>/dev/null

       if [ $? -eq 0 ];then

           rs_donw=0

           a_group_down=0

         for i in 1 2;do

           rs_down=$(nmap -p 80 $rs|grep open|wc -l)

           let a_group_down+=rs_down

           sleep 2

         done

         if [ $a_group_down -eq 0 ];then

           ipvsadm -d -t ${vip}:80 -r ${rs}:80

         fi

       fi

     done

    }

    join_check() {

     for rs in ${rs_ip[@]};do

       ipvsadm -ln|grep $rs &>/dev/null

       if [ $? -ne 0 ];then

         a_group_up=0

         rs_up=0

         for j in 1 2;do

           rs_up=$(nmap -p 80 $rs|grep open|wc -l)

           let a_group_up+=rs_up

           sleep 2

         done

         if [ $a_group_up -eq 2 ];then

           ipvsadm -a -t ${vip}:80 -r ${rs}:80 -g -w 1

         fi

       fi

     done

    }

    check_rs() {

     while true;do

     remove_check

     sleep 1

     join_check

     sleep 1

     done

    }

    check_rs

    企业面试题25


    【LVS客户端节点】开发LVS客户端设置VIP以及抑制ARP的管理脚本

    实现:/etc/init.d/lvsclient {start|stop|restart}


    [root@web01-lnmp-09 scripts]# cat /etc/init.d/lvsclient

    #!/bin/bash

    #chkconfig: 2345 37 57

    #Write by Bevin 2016

    #LVS_Nginx

    export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

    [ -f /etc/init.d/functions ] && source /etc/init.d/functions

    #Step 1

    function L_ipadd() {

     VIPRES=`ip addr|grep 10.0.0.12|wc -l`

     if [ $VIPRES -eq 0 ]

       then

         ip addr add 10.0.0.12/32 dev lo label lo:12

         route add -host 10.0.0.12 dev lo

         sleep 1

         VIPRES=`ip addr|grep 10.0.0.12|wc -l`

         if [ $VIPRES -eq 0 ]

           then

             ip addr add 10.0.0.12/32 dev lo label lo:12

             route add -host 10.0.0.12 dev lo

             sleep 1

             VIPRES=`ip addr|grep 10.0.0.12|wc -l`

             if [ $VIPRES -eq 0 ]

               then

                 action "ip addr add 10.0.0.12/32 ..."   /bin/false

                 exit 1

               else

                 action "ip addr add 10.0.0.12/32 ..."   /bin/true

             fi

           else

             action "ip addr add 10.0.0.12/32 ..."   /bin/true

         fi

       else

         action "ip addr add 10.0.0.12/32 is exist."

     fi

     echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore

     echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce

     echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore

     echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce

    }

    function L_ipdel() {

     VIPRES=`ip addr|grep 10.0.0.12|wc -l`

     if [ $VIPRES -ne 0 ]

       then

         ip addr del 10.0.0.12/32 dev lo

         route del -host 10.0.0.12 dev lo

         sleep 1

         VIPRES=`ip addr|grep 10.0.0.12|wc -l`

         if [ $VIPRES -ne 0 ]

           then

             action "ip addr del 10.0.0.12/32 ..."  /bin/false

             exit 1

           else

             action "ip addr del 10.0.0.12/32 ..."  /bin/true

         fi

       else

             action "ip addr del 10.0.0.12/32 ..."   /bin/true

     fi

     echo "0" > /proc/sys/net/ipv4/conf/lo/arp_ignore

     echo "0" > /proc/sys/net/ipv4/conf/lo/arp_announce

     echo "0" > /proc/sys/net/ipv4/conf/all/arp_ignore

     echo "0" > /proc/sys/net/ipv4/conf/all/arp_announce

    }

    #Step 2

    function L_exec() {

     case "$1" in

       start)

         L_ipadd

       ;;

       stop)

         L_ipdel

       ;;

       status)

         VIPRES=`ip addr|grep 10.0.0.12|wc -l`

         sleep 1

         if [ $VIPRES -ne 0 ]

           then

             echo "LVS Nginx is working"

           else

             echo "LVS Nginx is not working"

         fi

       ;;

       restart)

         VIPRES=`ip addr|grep 10.0.0.12|wc -l`

         if [ $VIPRES -ne 0 ]

           then

             L_ipdel

             sleep 1

             L_ipadd

           else

             echo  "ip 10.0.0.12 is not working"

             sleep 1

             L_ipadd

         fi

       ;;

       *)

         echo "USAGE: $0 {start|stop|restart|status}"

     esac

    }

    企业面试题26


    【LVS备节点】模拟keepalved vrrp功能,监听主节点,如果主节点不可访问则备节点启动并配置LVS实现接管主节点的资源提供服务(提醒:注意ARP缓存)


    [root@lvs-lb01-05 scripts]# cat lvs.sh

    #!/bin/bash

    #Write by Bevin 2016

    export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

    [ -f /etc/init.d/functions ] && source /etc/init.d/functions

    #Step 1 Instal ip_vs

    Ch_ipvs=`rpm -qa ipvsadm|wc -l`

    if [ $Ch_ipvs -eq 0 ]

     then

       yum install ipvsadm -y

    fi

    #Step 2 Functions

    VIP=10.0.0.12

    V_TAIL=12

    RIP=(

    9

    10

    )

    function L_LVS_VIP_RIP() {

     VIPRES=`ip addr|grep $VIP|wc -l`

     if [ $VIPRES -eq 0 ]

       then

         ip addr add $VIP/24 dev eth0 label eth0:$V_TAIL

         ipvsadm -C

         ipvsadm -A -t $VIP:80 -s rr

         for n in ${RIP[*]}

         do

           ipvsadm -a -t $VIP:80 -r 10.0.0.$n:80 -g

         done

       else

         ipvsadm -C

         ipvsadm -A -t $VIP:80 -s rr

         for n in ${RIP[*]}

         do

           ipvsadm -a -t $VIP:80 -r 10.0.0.$n:80 -g

         done

     fi

    }

    function L_check_vip() {

     VIPRES=`ip addr|grep $VIP|wc -l`

     if [ $VIPRES -eq 0 ]

       then

         L_LVS_VIP_RIP

         sleep 5

         if [ $VIPRES -eq 0 ]

           then

             L_LVS_VIP_RIP

             sleep 5

             if [ $VIPRES -eq 0 ]

               then

                 echo "Warning: lb01: $VIP is down."|mail -s txbevin@sina.com

                 exit 1

             fi

         fi

     fi

     sleep 5

    }

    function L_check_rip() {

     for n in ${RIP[*]}

     do

       CurlRes=`curl -I -s 10.0.0.$n|grep -E "200|301|302"|wc -l`

       if [ $CurlRes -ne 0 ]

         then

           RS=`ipvsadm -Ln|grep 10.0.0.$n|wc -l`

           if [ $RS -eq 0 ]

             then

               ipvsadm -a -t $VIP:80 -r 10.0.0.$n:80

           fi

         else

           ipvsadm -d -t $VIP:80 -r 10.0.0.$n:80

           mail -s "10.0.0.$n nginx is down at $(date +%F-%T)." txbevin@sina.com

           continue

       fi

     done

     sleep 5

    }

    #Step 3

    L_LVS_VIP_RIP

    while true

    do

     L_check_vip

     sleep 1

     L_check_rip

     sleep 1

    done

    后面几道题如果大家会可以把答案发送给我

    mail:new_oldboy@163.com

    -------------------


    企业面试题27


    请用shell或Python编写一个正方形(oldboy_square.sh),接收用户输入的数字。

    例如:


    [root@oldboy ~]# sh oldboy_square1.sh

    Please Enter a number:5

    ++++++++++

    ++++++++++

    ++++++++++

    ++++++++++

    ++++++++++

    [root@oldboy ~]# sh oldboy_square2.sh

    Please Enter a number:9

    ■■■■■■■■■

    ■■■■■■■■■

    ■■■■■■■■■

    ■■■■■■■■■

    ■■■■■■■■■

    ■■■■■■■■■

    ■■■■■■■■■

    ■■■■■■■■■

    ■■■■■■■■■

    企业面试题28


    请用shell或Python编写一个等腰三角形(oldboy2_triangle.sh),接收用户输入的数字。

    例如:


    [root@oldboy ~]# sh oldboy2_triangle.sh

    Please Enter a number:5

       *

      ***

     *****

    *******

    *********

    [root@oldboy ~]# sh oldboy2_triangle.sh

    Please Enter a number:8

          *

         ***

        *****

       *******

      *********

     ***********

    *************

    ***************

    企业面试题29


    请用shell或Python编写一个画直角梯形程序(oldboy4.sh),接收用户输入的参数n,m

    例如:


    [root@oldboy ~]# sh oldboy4.sh 4 6

    ****

    *****

    ******

    27,28,29三道题可以参考

    http://oldboy.blog.51cto.com/2561410/1718607

二维码加载中...
本文作者:Mr.linus      文章标题: 老男孩Shell企业面试题30道附答案
本文地址:http://www.90qj.com/398.html  本文已经被百度收录,点击查看详情
版权声明:若无注明,本文皆为“挨踢 Blog”原创,转载请保留文章出处。
挤眼 亲亲 咆哮 开心 想想 可怜 糗大了 委屈 哈哈 小声点 右哼哼 左哼哼 疑问 坏笑 赚钱啦 悲伤 耍酷 勾引 厉害 握手 耶 嘻嘻 害羞 鼓掌 馋嘴 抓狂 抱抱 围观 威武 给力
提交评论

清空信息
关闭评论