试题一

请按照这样的日期格式(xxxx-xx-xx)每日生成一个文件, 例如生成的文件名为2017-12-20.log, 并且把磁盘的使用情况写到到这个文件中, 不用考虑cron,仅仅写脚本即可

核心要点:

  • date用法
  • 日志规范
#!/bin/bash
d=`date +%F`
d_time=`date +'%Y-%m-%d %H:%M:%S'`
dir=/data/logs/disklog
if [ ! -d dir ]; then
    mkdir -pdir
fi

function disk_find() {
    shell_cmd=@
    [ ! -fdir/d.log ] && touchdir/d.log
    echo "d_time INFO 日志检查" >> dir/d.log
    shell_cmd 1>>dir/d.log
    if [? -ne 0 ]; then
        echo '命令或参数不正确!'>>dir/d.log
    fi
}

disk_find $*

试题二

有日志1.log,部分内容如下

112.111.12.248 – [25/Sep/2013:16:08:31 +0800]formula-x.haotui.com “/seccode.php?update=0.5593110133088248″ 200″http://formula-x.haotui.com/registerbbs.php” “Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1;)”
61.147.76.51 – [25/Sep/2013:16:08:31 +0800]xyzdiy.5d6d.com “/attachment.php?aid=4554&k=9ce51e2c376bc861603c7689d97c04a1&t=1334564048&fid=9&sid=zgohwYoLZq2qPW233ZIRsJiUeu22XqE8f49jY9mouRSoE71″ 301″http://xyzdiy.5d6d.com/thread-1435-1-23.html” “Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)”

统计出每个IP访问量有多少

核心要点:

  • awk用法
  • sort用法
  • uniq用法
awk '{print $1}' 1.log |sort |uniq -c

试题三

写一个脚本计算一下linux系统所有进程占用内存大小的和。

核心要点:

  • 内存使用率命令ps aux
  • awk用法
  • 循环用法

方法一

ps aux|awk '{print 6}'|grep -v 'TIME COMMAND'|while read line; do a=[a+line];echo $a; done;

方法二

#!/bin/bash
sum=0
for i in `ps aux|awk '{print 6}'|grep -v 'TIME COMMAND'`
do
    sum=[sum+i]
done

echo $sum

试题四

设计一个脚本,监控远程的一台机器(假设ip为192.168.10.180)的存活状态,当发现宕机时发一封邮件给你自己。

核心要点:

  • 通过nc命令监测远程端口3389或者22(本例ssh端口:31235)
  • 此处省略邮件发送直接以echo形式输出
#!/bin/bash
# yum install -y nc
IP_HOST=192.168.10.180
PORT=31235

function host_check() {
     host=1
     port=2
     nc -v -w 1 host -zport &>/dev/null
     if [ ? -eq 0 ]; then
         echo '服务器状态监测正常'
     else
         echo '服务器状态监测异常'
     fi
}

host_checkIP_HOST $PORT

试题五

找到/123目录下所有后缀名为.txt的文件

  • 1.批量修改.txt为.txt.bak
  • 2.把所有.bak文件打包压缩为123.tar.gz
  • 3.批量还原文件的名字,即把增加的.bak再删除

核心要点:

  • find命令使用
  • tar命令使用
  • rm命令使用
#!/bin/bash
dir_path='/123'
[ -d dir_path ] && cddir_path || exit 8

find ./ -name "*.txt" -type f|while read file
do
    mv filefile.bak
    echo file.bak
done>/tmp/file.txt

if [ -s /tmp/file.txt ]; then
    tar -czvf 123.tar.gz `cat /tmp/file.txt`
    for i in `cat /tmp/file.txt`
    do
        rm -rfi
    done
else
    echo '无打包文件'
fi

试题六

写一个脚本,判断本机的80端口(假如服务为httpd)是否开启着,如果开启着什么都不做,如果发现端口不存在,那么重启一下httpd服务, 并发邮件通知你自己。脚本写好后,可以每一分钟执行一次,也可以写一个死循环的脚本,30s检测一次。

核心要点:

  • nc命令监测端口
  • 重启httpd服务
#!/bin/bash
# yum install -y nc
HOST_IP=192.168.10.180
PORT=80
function server_tcp_check() {
    host_ip=1
    port=2
    d_time=`date +'%Y-%m-%d %H:%M:%S'`
    nc -v -w 1 host_ip -zport &>/dev/null
    result=?
    if [result -eq 0 ]; then
        echo "d_time [INFO] HOST:host_ip:port 检查正常"
    else
        echo "d_time [ERROR] HOST:host_ip:port 检查异常,即将重启端口:port"
        sudo systemctl restart httpd
    fi
    sleep 5
}

while true
do
    echo '服务端口状态检查...'
    server_tcp_checkHOST_IP $PORT
done

试题七

设计一个shell脚本来备份数据库,首先在本地服务器上保存一份数据,然后再远程拷贝一份,本地保存一周的数据,远程保存一个月。

假定,我们知道mysql root账号的密码,要备份的库为discuz,本地备份目录为/bak/mysql, 远程服务器ip为192.168.123.30, 远程提供了一个rsync服务,备份的地址是 192.168.123.30::backup . 写完脚本后,需要加入到cron中,每天凌晨3点执行。

核心要点:

  • rsync用法
  • mysql备份用法
#!/bin/bash
. /etc/profile

#数据库用户名
##GRANT SELECT, RELOAD, SUPER, LOCK TABLES ON *.* TO 'mysqldumper'@'localhost' identified by 're8Z3db57dltINJdWF5e&2fMu';
##flush privileges ;
dbuser='mysqldumper'
#数据库用密码
dbpasswd='re8Z3db57dltINJdWF5e&2fMu'
#备份时间
backtime=`date '+%Y%m%d%H%M%S'`
t_time=`date '+%Y-%m-%d %H:%M:%S'`

#日志备份路径
logpath='/data/mysqlbakup'
#数据备份路径
datapath='/data/mysqlbakup'

if [ ! -d {datapath} ];then  mkdir{datapath} -p
fi

#日志记录头部
echo "备份时间为{t_time},备份数据库表{dbname} 开始" >> {logpath}/log.log

#获取数据库名
#dbname=`mysql -u{dbuser} -p{dbpasswd} -e "show databases;" |egrep -v "Database|sys|information_schema|mysql|performance_schema"`
dbname='discuz'

#正式备份数据库
for db indbname; do
  mysqldump -u{dbuser} -p{dbpasswd} -F -B db --master-data={1,2} --single-transaction |gzip>{logpath}/{db}{backtime}.sql.gz 2>> {logpath}/mysqllog.log
  #备份成功以下操作
  if [ "?" == 0 ];then
    cd datapath
    #删除七天前备份,也就是只保存7天内的备份
    finddatapath -name "*.gz" -type f -mtime +7 -exec rm -rf {} \; > /dev/null 2>&1
    echo "{t_time} 数据库{db} 备份成功!!" >> {logpath}/mysqllog.log
  else
    #备份失败则进行以下操作
    echo "{t_time} 数据库 {db} 备份失败!!" >>{logpath}/mysqllog.log
  fi
done
rsync -avzP $datapath rsync_backup@192.168.10.140::backup/  --password-file=/etc/rsyncd.pas

#备注:这里想用rsync实现远端删除30天前的文件还是有点难度,可以在远端单独写个find操作

试题八

服务器上跑的是LNMP环境,近期总是有502现象。502为网站访问的状态码,200正常,502错误是nginx最为普遍的错误状态码。

由于502只是暂时的,并且只要一重启php-fpm服务则502消失,但不重启的话,则会一直持续很长时间。

所以有必要写一个监控脚本,监控访问日志的状态码,一旦发生502,则自动重启一下php-fpm。

核心要点:

  • 读取日志
  • 判断异常处理(shell目前没有发现好的方法精准读取每一行,只能泛匹配)
#!/bin/bash
[ -f /etc/profile ] && . /etc/profile
ACCESS_LOG=/var/log/httpd/access_log
ERROR_CODE=403

function check_log() {
    check_log=1
    code=2
    d_time=`date +'%Y-%m-%d %H:%M:%S'`
    tail -300 check_log|awk '{print9}'|grep code &>/dev/null
    if [? -eq 0 ]; then
        echo "d_time 日志检查异常,服务即将重启"
        sudo systemctl restart httpd.service
    else
        echo "d_time 日志检查正常"
    fi
    sleep 5
}

while true
do
    check_log ACCESS_LOGERROR_CODE
done

#备注:本机没搞LNMP,难得去配置环境,大体就是这种模式实现,只是tail -300 还是显得极lower,通过python可以进行整行读取

试题九

把一个文本文档的前5行中包含字母的行删除掉,同时把6到10行中的全部字母删除掉。

核心要点:

  • sed命令使用
sed -n '1,5'p get-pip.py |sed '/[A-Za-z]/d'
sed -n '6,10'p get-pip.py |sed 's/[A-Za-z]//g'

试题十

shell打印下面这句话中字母数小于6的单词。 Bash also interprets a number of multi-character options.

核心要点:

  • awk用法
  • wc用法
#!/bin/bash
c="Bash also interprets a number of multi-character options."

n=`echo c|awk -F '[ +-.]' '{print NF}'`

for ((i=0;i<n;i++))
do
    l=`echo c|awk -F '[ +-.]' -v j=i '{print j}'|wc -L`
    if [l -lt 6 ]; then
        echo `echo c|awk -F '[ +-.]' -v j=i '{print $j}'`
    fi
done
最后修改日期: 2020年8月19日

作者

留言

撰写回覆或留言

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