试题一
阿里云的机器,今天收到客服来的电话,说服务器的磁盘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
留言