您当前的位置: 首页 >  面试

壹小俊

暂无认证

  • 4浏览

    0关注

    885博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

一次面试,让我认识到Shell的重要性

壹小俊 发布时间:2021-09-28 10:36:16 ,浏览量:4

大家好,今天跟大家奉献一下我面试90多家公司遇到的shell的问题。

书接上文,一次面试,让我认识到Linux的重要性,不知道前因后果的请移步上文。

面试中,一般都会遇到那个让你感觉到恶心的面试官问你不着边际的技术问题,所以,学好linux也是一项技能,让你在面试中,傲视群雄。

在IT届,有个不成文的规矩,叫,面试造火箭,工作拧螺丝。先点赞,后观看。

小编之前做过汽车改装维修,当第一次听到shell的时候想到是壳牌机油。

然而,他是个这。

image.png

导致小编每次在工作中一听到shell,立马就想到了机油。好了,书归正传,接下来我聊一下在面试中遇到的shell问题。

这次我直接摆出面试中遇到的技术问题,直接说。

序号问题1shell是什么2编写一个简单的shell3你在什么场景下使用shell4使用shell遇到的问题 1.shell是什么

官方解释如下:在计算机科学中,Shell俗称壳(用来区别于核),是指“为使用者提供操作界面”的软件(command interpreter,命令解析器)。它类似于DOS下的COMMAND.COM和后来的cmd.exe。它接收用户命令,然后调用相应的应用程序。

看不懂不要紧,接着看哈。Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。

其实很简单,总结下来,就是

a,shell是命令语言,如ll,ls,cp等。 b,shell也是编程语言。如他有自己的流程控制语句。

if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi
复制代码
2.编写一个简单的shell

代码:

#!/bin/bash
echo "Hello World !"
复制代码

运行:

chmod +x ./文件.sh  #使脚本具有执行权限
./文件.sh  #执行脚本
复制代码

其实这段代码没有实质性的作用,只是做简单的输出,小编只是不想在多做代码的输出,希望大家去面试的时候准备一些比较有实质性作用的代码。

3,你在什么场景下使用shell

使用的场景很多,我就简单的说几个。

a,检查主机存活状态

比如说我们使用多个服务的时候,master服务说不定在什么时候挂掉,但是我们有时候不感知,等到发现的时候就已经晚了,这个时候我们可以使用shell程序来定时ping主机,等到主机挂掉,我们可以使用shell来切换机器,让其他机器中的某一个机器成为主机。

简单代码:

# !/bin/bash  

IP_LIST="192.168.18.1 192.168.1.1 192.168.18.2"\

for IP in $IP_LIST; do

    NUM=1

    while [ $NUM -le 3 ]; do

        if ping -c 1 $IP > /dev/null; then

            echo "$IP Ping is successful."

            break

        else

            # echo "$IP Ping is failure $NUM"

            FAIL_COUNT[$NUM]=$IP

            let NUM++

        fi

    done

    if [ ${#FAIL_COUNT[ *]} -eq 3 ];then

        echo "${FAIL_COUNT[1]} Ping is failure!"

        unset FAIL_COUNT[* ]

    fi

done

复制代码

b,监控CPU、内存和硬盘利用率

在使用集群的时候,想查看多个机器中的cpu等资源的使用情况的时候,我们不可能一台一台机器的去看。这个时候可以使用shell程序来收集。

1)CPU

借助vmstat工具来分析CPU统计信息。

# []()!/bin/bash

DATE=$(date +%F" "%H:%M)

IP=$(ifconfig eth0 |awk -F  [ :]+   /inet addr/{print $4} )  # 只支持CentOS6\

MAIL="example@mail.com"

if ! which vmstat &>/dev/null; then

    echo "vmstat command no found, Please install procps package." 

    exit 1

fi

US=$(vmstat |awk  NR==3{print $13} )

SY=$(vmstat |awk  NR==3{print $14} )

IDLE=$(vmstat |awk  NR==3{print $15} )

WAIT=$(vmstat |awk  NR==3{print $16} )

USE=$(($US+$SY))

if [ $USE -ge 50 ]; then

    echo "

    Date: $DATE

    Host: $IP

    Problem: CPU utilization $USE

    " | mail -s "CPU Monitor" $MAIL

fi

2)内存

# []()!/bin/bash

DATE=$(date +%F" "%H:%M)

IP=$(ifconfig eth0 |awk -F  [ :]+   /inet addr/{print $4} )  

MAIL="example@mail.com"

TOTAL=$(free -m |awk  /Mem/{print $2} )

USE=$(free -m |awk  /Mem/{print $3-$6-$7} )

FREE=$(($TOTAL-$USE))

# []() 内存小于1G发送报警邮件

if [ $FREE -lt 1024 ]; then

    echo "

    Date: $DATE

    Host: $IP

    Problem: Total=$TOTAL,Use=$USE,Free=$FREE

    " | mail -s "Memory Monitor" $MAIL

fi

3)硬盘

# []()!/bin/bash

DATE=$(date +%F" "%H:%M)

IP=$(ifconfig eth0 |awk -F  [ :]+   /inet addr/{print $4} )  

MAIL="example@mail.com"

TOTAL=$(fdisk -l |awk -F [: ]+   BEGIN{OFS="="}/^Disk /dev/{printf "%s=%sG,",$2,$3} )

PART_USE=$(df -h |awk  BEGIN{OFS="="}/^/dev/{print $1,int($5),$6} )

for i in $PART_USE; do

    PART=$(echo $i |cut -d"=" -f1)

    USE=$(echo $i |cut -d"=" -f2)

    MOUNT=$(echo $i |cut -d"=" -f3)

    if [ $USE -gt 80 ]; then

        echo "

        Date: $DATE

        Host: $IP

        Total: $TOTAL

        Problem: $PART=$USE($MOUNT)

        " | mail -s "Disk Monitor" $MAIL

    fi

done

复制代码
4,使用shell遇到的问题

在编写shell文件的时候慎重使用rm命令。再一次编写shell的时候,用到了rm命令,判断的时候写错了,把自己用的开发服务器中的文件删除掉了。后来cp其他机器的文件把自己的服务器给修复好的。

大家其实面试到这个shell的问题时,一定会遇到面试官问你定时任务的使用。这里也简单的絮叨一下

crontab [-u username] [-l|-e|-r]

就是上面这个命令哈,但是好多大公司有自己的可视化web工具。

参数:

-u: 只有root才能进行这个任务,也即帮其他用户新建/删除crontab工作调度;

-e: 编辑crontab 的工作内容;

-l: 查阅crontab的工作内容;

-r: 删除所有的crontab的工作内容,若仅要删除一项,请用-e去编辑。

范例一:用dmtsai的身份在每天的12:00发信给自己

crontab -e

#此时会进入vi的编辑界面让你编辑工作。注意到,每项工作都是一行。

0    12   *   *   *   mail dmtsai -s "at 12:00" < /home/dmtsai/.bashrc
#分  时   日   月  周  |《==============命令行=======================》|
复制代码

代表意义分钟小时日期月份周命令数字范围0~590~231~311~120~7就命令啊

周的数字为0或7时,都代表“星期天”的意思。另外,还有一些辅助的字符,大概有下面这些:

特殊字符  代表意义*(星号)代表任何时刻都接受的意思。举例来说,范例一内那个日、月、周都是*,就代表着不论何月、何日的礼拜几的12:00都执行后续命令的意思。,(逗号)代表分隔时段的意思。举例来说,如果要执行的工作是3:00与6:00时,就会是:0 3,6 * * * command时间还是有五列,不过第二列是 3,6 ,代表3与6都适用-(减号) 代表一段时间范围内,举例来说,8点到12点之间的每小时的20分都进行一项工作:20 8-12 * * * command仔细看到第二列变成8-12.代表 8,9,10,11,12 都适用的意思/n(斜线) 那个n代表数字,即是每隔n单位间隔的意思,例如每五分钟进行一次,则:/5 * * * * command用与/5来搭配,也可以写成0-59/5,意思相同

大家看完之后,可以按照这个套路来面试,记得背一下crontab后面时间的使用哈,切记,切记。

作者:一只睡着的猫 链接:https://juejin.cn/post/7012778250053091342 来源:掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

关注
打赏
1664335782
查看更多评论
立即登录/注册

微信扫码登录

0.0955s