编写一个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