试题一

阿里云的机器,今天收到客服来的电话,说服务器的磁盘io很重。于是登录到服务器查看,并没有发现问题,所以怀疑是间歇性地。正要考虑写个脚本的时候,幸运的抓到了一个线索,造成磁盘io很高的幕后黑手是mysql。此时去show processlist,但未发现有问题的队列。原来只是一瞬间。只好继续来写脚本,思路是,每5s检测一次磁盘io,当发现问题去查询mysql的processlist。

#!/bin/bash
#

which iostat &>/dev/null
if [ ? -ne 0 ]; then
    yum install -y sysstat
fi

while true;
do
    t_time=`date '+%Y%m%d%H%M%S'`
    iostat -xd 1 5 |grep "^sd[a-z]">/tmp/io.log
    sum_count=`awk '{sum=sum+NF} END {print sum}' /tmp/io.log`
    avg_sum=`echo "scale=2;sum_count/5"|bc`
    avg_sum=`echoavg_sum|sed 's/^./0./g'`
    b=`echo avg_sum|cut -d '.' -f 1`
    if [b -gt 90 ]; then
        mysql -uroot -p123456 -e "show processlist" > /tmp/mysql_$t_time.log
    fi
    sleep 2
done

试题二

写一个截取tomcat catalina.out日志的脚本 tomcat实例t1-t4

试题三

写一个脚本让用户输入多个城市的名字(可以是中文),要求不少于5个,然后把这些城市存到一个数组里,最后用for循环把它们打印出来。

#!/bin/bash

read -p "输入不少于5个城市的名字,用空格分隔开:" name

n=`echo name|awk '{print NF}'`
if [n -lt 5 ]; then
    echo "请输入至少5个城市的名字."
    exit
fi

city=(name)

for i in `seq 0[{#city[@]}-1]`
do
    echo{city[$i]}
done

试题四

需求背景是: 一个业务,有3台服务器(A,B,C)做负载均衡,由于规模太小目前并未使用专业的自动化运维工具。有新的需求时,开发同事改完代码会把变更上传到其中一台服务器A上。但是其他2台服务器也需要做相同变更。

写一个shell脚本,把A服务器上的变更代码同步到B和C上。 其中,你需要考虑到不需要同步的目录(假如有tmp、upload、logs、caches)

#!/bin/bash
#这个脚本用来代码上线
#作者:猿课-阿铭 www.apelearn.com
#日期:2018-12-12

dir=/data/wwwroot/www.aaa.com
B_IP=1.1.1.1
C_IP=2.2.2.2

rs()
{
    rsync -azP --exclude="logs" \
    --exclude="tmp" --exclude="upload" \
    --exclude="caches" dir/1:dir/
}

read -p "该脚本将会把本机的dir下的文件同步到B_IP和C_IP上,是否要继续?y|n" c

case $c in 
    y|Y)
    rs B_IP
    rs C_IP
    ;;
    n|N)
    exit
    ;;
    *)
    echo "你只能输入y或者n."
        ;;
esac

试题五

需求背景:

需要统计网站的并发量,并绘图。 说明: 只需要写出shell脚本即可,不用关心zabbix配置。

假设日志路径 /data/logs/www.aaa.com_access.log

日志格式如下:

112.107.15.12 – [07/Nov/2018:09:59:01 +0800] www.aaa.com “/api/live.php” 200″-” “Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)”

#!/bin/bash
#这个脚本用来计算网站并发量
#作者:猿课-阿铭 www.apelearn.com
#日期:2018-12-12

LANG=en
t=`date -d "-1 second" +%d/%b/%Y:%`
log=/data/logs/www.aaa.com_access.log

tail -1000 log |grep -c "t"

试题六

在centos6系统里,我们可以使用ntsysv关闭不需要开机启动的服务,当然也可以使用chkconfig工具来实现。

写一个shell脚本,用chkconfig工具把不常用的服务关闭。脚本需要写成交互式的,需要我们给它提供关闭的服务名字。

#!/bin/bash
#这个脚本用来关闭服务
#作者:猿课-阿铭 www.apelearn.com
#日期:2018-12-14

LANG=en

while :
do
    chkconfig --list 2>/dev/null|grep '3:on' |awk '{print 1}'>/tmp/on_sev.txt
    echo -e "\033[32m系统里开启了这些服务: \033[0m"
    cat /tmp/on_sev.txt
    echo
    read -p "Please select a service from this list: " s

    if ! grep -qw "s" /tmp/on_sev.txt
    then
    echo -e "\033[31m你提供的服务名并未开启.\033[0m"
    continue
    fi
    chkconfig $s off
    break
done 

试题七

在生产环境中,经常遇到tomcat无法彻底关闭,也就是说用tomcat自带shutdown.sh脚本无法将java进程完全关掉。所以,需要借助shell脚本,将进程杀死,然后再启动。

写一个shell脚本,实现上述功能。彻底杀死一个进程的命令是 kill -9 pid。

#!/bin/bash
#这个脚本用来彻底杀死Tomcat进程
#作者:猿课-阿铭 www.apelearn.com
#日期:2018-12-14

dir=/usr/local/tomcat/bin/

java_pc()
{
    pgrep java|wc -l
}


cd dir
./shutdown.sh

count=0

while [count -lt 5 ]
do
    n=`java_pc`
    if [ n -gt 0 ]
    then
    killall java
    count=[count+1]
    sleep 1
    else
    break
    fi
done

n=`java_pc`
if [n -gt 0 ]
then 
    killall -9 java
fi

n=`java_pc`
if [ n -gt 0 ]
then
    echo "Tomcat无法强制杀死。"
    exit
fi

cddir
./startup.sh

试题八

至少用两种方法,批量把当前目录下面所有文件名后缀为.bak的后缀去掉,比如1.txt.bak去掉后为1.txt

find ./ -name "*txt.bak"|awk -F '.bak' '{print $0}'
ls |while read line; do echo line |grep ".txt.bak" &>/dev/null; if [ ? -eq 0 ]; then echo "{line%%.bak}"; fi; done

试题九

写一个shell脚本,查询指定域名的过期时间,并在到期前一周,每天发一封提醒邮件。

#!/bin/bash
#这个脚本用来检查域名是否到期
#作者:猿课-阿铭 www.apelearn.com
#日期:2018-12-14

mail_u=admin@admin.com
#当前日期时间戳,用于和域名的到期时间做比较
t1=`date +%s`

#检测whois命令是否存在,不存在则安装jwhois包
is_install_whois()
{
    which whois >/dev/null 2>/dev/null
    if [ ? -ne 0 ]
    then
    yum install -y epel-release
        yum install -y jwhois
    fi
}

notify()
{
    #e_d=`whois1|grep 'Expiry Date'|awk '{print 4}'|cut -d 'T' -f 1`
    e_d=`whois1|grep 'Expiration'|tail -1 |awk '{print 5}' |awk -F 'T' '{print1}'`
    #如果e_d的值为空,则过滤关键词'Expiration Time'
    if [ -z "e_d" ]
    then
        e_d=`whois1|grep 'Expiration Time'|awk '{print 3}'`
    fi
    #将域名过期的日期转化为时间戳
    e_t=`date -d "e_d" +%s`
    #计算一周一共有多少秒
    n=`echo "86400*7"|bc`
    e_t1=[e_t-n]
    e_t2=[e_t+n]
    if [ t1 -gee_t1 ] && [ t1 -lte_t ]
    then
        python mail.py  mail_u "Domain1 will  to be expired." "Domain 1 expire date ise_d."
    fi
    if [ t1 -gee_t ] && [ t1 -lte_t2 ]
    then
        python mail.py mail_u "Domain1 has been expired" "Domain 1 expire date ise_d." 
    fi
}

#检测上次运行的whois查询进程是否存在
#若存在,需要杀死进程,以免影响本次脚本执行
if pgrep whois &>/dev/null
then
    killall -9 whois
fi

is_install_whois

for d in aaa.com bbb.com  aaa.cn
do
    notify $d
done

试题十

写一个shell脚本,当我们执行时,提示要输入对方的ip和root密码,然后可以自动把本机的公钥增加到对方机器上,从而实现密钥认证。

#!/bin/bash

read -p "输入一个IP地址:" ip
read -p "输入此机器的root密码:" pass

function is_install() {
   if ! rpm -q 1 &>/dev/null
   then
       yum install -y1 
   fi
}

is_install openssh-clients
is_install expect

if [ ! -f ~/.ssh/id_rsa.pub ]; then
    echo -e "\n"|ssh-keygen -p ''
fi

cat > key.expect <<EOF
#!/usr/bin/expect
set host [lindex \argv 0]
set passwd [lindex \$argv 1]
spawn scp -P 31235 /root/.ssh/id_rsa.pub  root@\$host:/tmp
expect {
    "yes/no" { send "yes\r"; exp_continue}
    "password:" { send "\$passwd\r" }
}
expect eof
EOF

chmod a+x key.expect

./key.expectip $pasd
最后修改日期: 2020年8月29日

作者

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。