shell流程控制笔试题

编写一个shell脚本,判断某一个服务是否运行,如果该服务不存在,安装后启动该服务。

判断此题的侧重点:
(1)考察脚本编写能力
(2)核心在于判断进程是否运行的方式
方式一:
查看进程

#! /bin/bash
  
read -p "请输入服务名称" service_name
var=$(ps -elf | grep $service_name | grep -v grep | wc -l)
echo $var
#判断服务进程个数,当进程个数等于0时,说明没有启动服务,当进程大于0时,说明该服务已启动。
if [ $var -gt 0 ]
then
        echo "该服务已启动"
else
        read -p "请输入软件包名" packs_name
        if rpm -q $packs_name &>/dev/null
        then
                echo "软件包已安装"
        else
                yum install $packs_name -y &>/dev/null
                systemctl start $service_name
        fi
fi

结果:

[root@localhost ~]# vim chen.sh 
[root@localhost ~]# ./chen.sh 
请输入服务名称httpd
1
该服务已启动
[root@localhost ~]# yum remove httpd -y
[root@localhost ~]# ./chen.sh 
请输入服务名称httpd
0
请输入软件包名httpd
[root@localhost ~]# ps -elf | grep httpd | grep -v grep | wc -l
5

方式二:
产看端口:
分为本地查看和远程查看
本地查看(netstat,ss,lsof)
1.netstat

#! /bin/bash
  
read -p "请输入服务名称" service_name
var=$(netstat -lnupt | grep 80 | wc -l)
echo $var
#判断服务进程个数,当进程个数等于0时,说明没有启动服务,当进程大于0时,说明该服务已启动。
if [ $var -gt 0 ]
then
        echo "该服务已启动"
else
        read -p "请输入软件包名" packs_name
        if rpm -q $packs_name &>/dev/null
        then
                echo "软件包已安装"
        else
                yum install $packs_name -y &>/dev/null
                systemctl start $service_name
        fi
fi

2.ss

#! /bin/bash
  
read -p "请输入服务名称" service_name
var=$(ss -lnupt | grep 80 | wc -l)
echo $var
#判断服务进程个数,当进程个数等于0时,说明没有启动服务,当进程大于0时,说明该服务已启动。
if [ $var -gt 0 ]
then
        echo "该服务已启动"
else
        read -p "请输入软件包名" packs_name
        if rpm -q $packs_name &>/dev/null
        then
                echo "软件包已安装"
        else
                yum install $packs_name -y &>/dev/null
                systemctl start $service_name
        fi
fi

3.lsof
使用该工具时要安装lsof

#! /bin/bash
  
read -p "请输入服务名称" service_name
var=$(lsof -i:80 | grep 80 | wc -l)
echo $var
#判断服务进程个数,当进程个数等于0时,说明没有启动服务,当进程大于0时,说明该服务已启动。
if [ $var -gt 0 ]
then
        echo "该服务已启动"
else
        read -p "请输入软件包名" packs_name
        if rpm -q $packs_name &>/dev/null
        then
                echo "软件包已安装"
        else
                yum install $packs_name -y &>/dev/null
                systemctl start $service_name
        fi
fi

远程查看(telnet,nmap,nc)
1.telnet
2.nmap (使用时需要安装nmap)

#! /bin/bash
  
read -p "请输入服务名称" service_name
var=$(nmap -p 80 127.0.0.1 | grep open | wc -l)
echo $var
#判断服务进程个数,当进程个数等于0时,说明没有启动服务,当进程大于0时,说明该服务已启动。
if [ $var -gt 0 ]
then
        echo "该服务已启动"
else
        read -p "请输入软件包名" packs_name
        if rpm -q $packs_name &>/dev/null
        then
                echo "软件包已安装"
        else
                yum install $packs_name -y &>/dev/null
                systemctl start $service_name
        fi
fi

3.nc (使用时需安装nc)

命令中,这些标志是:
-z – 设置 nc 只是扫描侦听守护进程,实际上不向它们发送任何数据。
-v – 启用详细模式

#! /bin/bash
  
read -p "请输入服务名称" service_name
var=$( nc -zv 192.168.150.136 80 |grep Ncat | wc -l)
echo $var
#判断服务进程个数,当进程个数等于0时,说明没有启动服务,当进程大于0时,说明该服务已启动。
if [ $var -gt 2 ]
then
        echo "该服务已启动"
else
        read -p "请输入软件包名" packs_name
        if rpm -q $packs_name &>/dev/null
        then
                echo "软件包已安装"
        else
                yum install $packs_name -y &>/dev/null
                systemctl start $service_name
        fi
fi

方式三:
使用命令:

#! /bin/bash
read -p "请输入服务名" service_name
if [ "$(systemctl is-active $service_name)" = "active" ]
then
        echo "$service_name 已启动"
else
        read -p "请输入软件包名" packs_name
        if rpm -q $packs_name
        then
                echo "软件包已安装"
                systemctl start $service_name &>/dev/null
        else
                yum install $packs_name &>/dev/null
                systemctl start $service_name &>/dev/null
        fi
fi

结果:

[root@localhost ~]# vim chen1.sh
[root@localhost ~]# ./chen1.sh 
请输入服务名httpd
httpd 已启动

方式四:
使用命令的返回结果判断:

#! /bin/bash
read -p "请输入服务名" service_name
systemctl status $service_name
if [ echo? eq 0 ]
then
        echo "$service_name 已启动"
else
        read -p "请输入软件包名" packs_name
        if rpm -q $packs_name
        then
                echo "软件包已安装"
                systemctl start $service_name
        else
                yum install $packs_name
                systemctl start $service_name
        fi
fi
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值