Linux下Shell脚本实现统一管理服务启停重启
公司今年开始了大批量的裁员,人心惶惶,所以强迫自己学习点新知识,刚好领导给找了个事情,让写个脚本实现一键启停Linux服务器上的服务,于是开始研究这个怎么搞。
最开始的时候,有点想当然了,觉得一键启停不就是写个菜单,调用一下服务启动停止的命令就可以实现,但是在写的过程中,发现全是坑,搞的心态都崩了,所以目前先写了一个脚本应付一下领导,当然了这个脚本也比较简单,适用性也有一定的局限性,不过也还是可以参考复用的,我会把局限性在最下边做个简单的说明。
好了 废话不多说,直接上代码, 我会在关键的地方给写注释,说明一下方式方法,后边如果有不懂的评论就行
#!/bin/bash ################################### # # # OWNER: 一袭白衣一 # # # # TIME:2024/8 # # # # version:1.0 # # # ################################### #清屏,好看点,不多说了哈
clear
#声明个数组存储数据
declare -A services #数组的样例哈
services=(
["服务1"]="服务所在的路径(到启动脚本所在的那一级),服务启动脚本所在路径(包含了启动脚本),服务名(进程里显示的那个),服务停止命令,打印日志所在路径(包含日志文件)"
["服务2"]="服务所在的路径(到启动脚本所在的那一级),服务启动脚本所在路径(包含了启动脚本),服务名(进程里显示的那个),服务停止命令,打印日志所在路径(包含日志文件)"
["服务3"]="服务所在的路径(到启动脚本所在的那一级),服务启动脚本所在路径(包含了启动脚本),服务名(进程里显示的那个),服务停止命令" #后边可以放多个服务信息 ) #这块不多说了哈,就是去数组里获取启动脚本路径,调用启动命令启动服务
start_service() {
#声明一个变量从数组内拿相关信息,用于后边调用
local service_path=$(echo ${services[$1]} | cut -d',' -f1)
local start_script=$(echo ${services[$1]} | cut -d',' -f2) echo "Starting $1 at $service_path......"
cd $service_path
$start_script start || { echo "Failed to start $1"; return 1; }
} #停止服务的模块,这部分有点特殊,我这边是因为有个服务的停止命令不是stop,是shutdown,所以做了个判断
#如果你们也有这样的情况,可以在这个地方做修改,没有的话,可以把中间的这个if拿掉
stop_service() {
#声明一个变量从数组内拿相关信息,用于后边调用
local service_path=$(echo ${services[$1]} | cut -d',' -f1)
local stop_script=$(echo ${services[$1]} | cut -d',' -f2)
local service_name=$(echo ${services[$1]} | cut -d',' -f3)
echo "Stopping $1 with: $service_path......"
cd $service_path
#这个if模块不需要可以拿掉
if [ "$service_name" == "特殊的服务" ];
then
$stop_script shutdown || { echo "Failed to stop $1"; return 1; }
else
$stop_script stop || { echo "Faild to stop $1"; return 1; }
fi
} #重启模块了哈,这个就更简单, 我就是重复调用了一遍stop、start模块
restart_service() { local service_name=$1
#如果服务状态正常,就先停止,再启动,否则就直接启动
if check_service_status $service_name; then
stop_service $service_name
fi
start_service $service_name } #检查服务的状态,我这边用的是ps命令。直接查看进程里的服务是否存在,判断服务是否存活
check_service_status() { local process_name=$(echo ${services[$1]} | cut -d',' -f3) if pgrep -u $(whoami) -f "$process_name" > /dev/null; then
echo "$1 is already running." return 0 else echo "$1 is not running." return 1 fi } #这块也是特殊服务用到的,有个服务启动的时间太长了所以必须要打印日志。。。。
#如果想让所有的服务都打印日志,可以在下边去掉判断,我会标注
#tail appserver&dbbackup log after them start watch_log(){ local service_name=$1 local log_file=$(echo ${services[$service_name]} | cut -d',' -f5) if [ -n "$log_file" ]; then echo "Now Show log for $service_name: $log_file" trap " echo 'Now Stop Show log for $service_name'; return" SIGINT tail -f $log_file else echo "No log to show " fi } #服务的list,用于check服务状态
service_processes_list() { for service in "${!services[@]}"; do
echo "Showing the service processes for $service"
check_service_status $service done } #主菜单展示,linux 的脚本就这样,丑点就丑点,好用就行
while true; do echo "#################################" echo "#****Services Control Menu******#" echo "# #" echo "# 1. Start Server #" echo "# 2. Stop Server #" echo "# 3. Restart Server #" echo "# 4. Check Service status #" echo "# 5. Exit menu #" echo "#################################" read -p "Please select an option: " option #进入实际的菜单功能模块了哈
case $option in 1) while true; do echo "Select a service to start:" select service in "${!services[@]}" "Back to main menu"; do case $service in "Back to main menu") break 2 ;; *) if [ -n "$service" ]; then start_service $service sleep 3
#这个地方就是我说的特殊处理的,这两个特殊服务需要打印日志,不能仅通过进程判断是否启动正常
#如果想打印所有服务的日志,可以把这块的判断拿掉
if [[ "$service" == "特殊服务1" || "$service" == "特殊服务2" ]]; then watch_log $service fi echo "Press any key to continue..." read -n 1 -s break else echo "Invalid option, please try again." fi ;; esac done done ;; 2) while true; do echo "Select a service to stop:" select service in "${!services[@]}" "Back to main menu"; do case $service in "Back to main menu") break 2 ;; *) if [ -n "$service" ]; then if check_service_status $service; then
#停止服务前,做了个提示,省的瞎搞误操作把生产环境服务停了。。。
read -p "Are you sure want to stop $service ? (Y/N):" confirm if [ "$confirm" == "Y" ]; then stop_service $service sleep 3 fi else echo "$service is not running." fi echo "Press any key to continue..." read -n 1 -s break else echo "Invalid option, please try again." fi ;; esac done done ;; 3) while true; do echo "Select a service to restart:" select service in "${!services[@]}" "Back to main menu"; do case $service in "Back to main menu") break 2 ;; *) if [ -n "$service" ]; then restart_service $service sleep 3
#这个地方跟上边一样,就是专门给特殊服务做的,不需要可以拿掉
if [[ "$service" == "特殊服务1" || "$service" == "特殊服务2" ]]; then watch_log $service fi echo "Press any key to continue..." read -n 1 -s break else echo "Invalid option, please try again." fi ;; esac done done ;; 4) service_processes_list sleep 3 echo "Press any key to continue..." read -n 1 -s ;; 5) exit 0 ;; *) echo "Invalid option, please try again." ;; esac done
上边的这个脚本,至少目前我在用的时候,是挺好用的,存在的不足后边在使用过程中一边发现一边更新吧,现在来说说这个脚本的局限性
第一:这个脚本如果在不修改代码的情况下,仅适用于启停命令为start stop/shutdown的服务
第二:这个脚本暂时还无法记录操作日志,即谁执行的脚本,执行的记录暂时没有存储,所以只能说慎重操作
第三:这个脚本暂时没有添加一键启停模块,后边我会再做修改,争取增加一键启动停止重启的功能,这样更便于运维
第四:这个脚本如果想要跨服务器使用的话,需要修改对应的服务信息等,还是不够便携
说完不足了,说说后边的想法吧,这个脚本我还会进一步更新(如果能帮到大家的话,我会在论坛再次更新修改版),然后这个脚本实现的功能领导不太满意,领导觉得太麻烦,想让我搞个一键脚本,并且这个脚本适用于所有服务器,就是把脚本扔在任何一台服务器上,都可以运行。。。。(当然了,前提是我们自己的服务器)。
真是一个头两个大,后边想想怎么搞,目前已经有了一点思路,在这里也跟大家提前分享一下:
首先这个脚本想要适用所有的服务器(我们的),那首先脚本要识别服务器ip,不同的服务器上有不同的服务(例如主、备、BCP服务啊这些),那还要识别主、备这样的服务类别,其实这样的话,最好的方式是把所有服务的信息以及服务器信息放在一个文件内,通过脚本识别服务器,然后去读取文件里对应的信息,大概这样的话应该可以。
就先这样吧,后边有更新了再发,欢迎大家批评指导-。-
Linux下Shell脚本实现统一管理服务启停重启的更多相关文章
- linux下shell脚本执行jar文件
最近在搞一个shell脚本启动jar文件个关闭jar文件的东东.搞得我都蛋疼了.今天晚上终于弄好了 话说,小弟的linux只是刚入门,经过各方查资料终于搞定了.话不多说,下面开始上小弟写的shell脚 ...
- linux下shell脚本学习
在Linux系统中,虽然有各种各样的图形化接口工具,但是sell仍然是一个非常灵活的工具.Shell不仅仅是命令的收集,而且是一门非常棒的编程语言.您可以通过使用shell使大量的任务自动化,shel ...
- linux下shell脚本启动jar包
本文采用的jar包是通过idea下maven打包的springboot项目. 写这个shell脚本是为了在linux下方便启动jar包时不用输入太多的shell命令,将启动脚本的一系列shell命令整 ...
- Linux 下Shell 脚本几种基本命令替换区别
Shell 脚本几种基本命令替换区别 前言:因为工作需要,需要编写 shell script .编写大量 shell script 时,累计了大量经验,也让自己开始迷糊几种函数输出调用的区别.后面和 ...
- Linux下Shell脚本运行程序不输出日志到终端
使用: 脚本路径/脚本名 >/dev/>& 说明: 可以简单的理解/dev/null是Linux下的回收站 >默认是把标准输出重定向 2>&1是把出错输出也定向 ...
- Linux下shell脚本实现mongodb定时自动备份
MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案. MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功 ...
- linux下shell 脚本 中windows换行符换成linux换行符
sed -i 's/\r//' filename window下默认是 \r\n linux下是\n unix下是\r
- linux下shell脚本执行方法及exec和source命令
exec和source都属于bash内部命令(builtins commands),在bash下输入man exec或man source可以查看所有的内部命令信息. bash shell的命令分为两 ...
- Linux下Shell脚本输出带颜色文字
文本终端的颜色可以使用“ANSI非常规字符序列”来生成.举例: echo -e "\033[44;37;5m ME \033[0m COOL" 以上命令设置作用如下: 背景色为蓝色 ...
- Linux下shell脚本中信号捕获和函数练习脚本之ping一个网段
该脚本主要的目的是练习在Linux bash脚本中捕获信号,顺便练习一下函数的使用,还有就是终止一个正在运行的程序后,该程序打开的文件的后续处理问题等等!脚本功能: ping一个网段内的IP,检测哪 ...
随机推荐
- C++ 中的 lowbit
lowbit 的定义 首先了解 lowbit 的定义 \(lowbit(n)\) ,为 \(n\) 的二进制原码中最低的一位 \(1\) 以及其后面的 \(0\) 所表示的数 举个简单的例子: 将 \ ...
- 火山引擎数智平台赋能火花思维,A/B测试加速创新
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群. 在数字化浪潮下,火花思维凭借其对数据驱动的理解与实践,搭上了业务快速增长的快车.这一效果的背后,离不开火花思 ...
- redis-sort by
对某个列表(list).集合(set).有序集合(zset)排序的时候按照某个 参考键 进行排序,而不是按照按照这个列表.集合或有序集合本身进行排序: 被排序的键和参考键在业务上有关联(这个由业务保证 ...
- Service Mesh Summit 回顾 | 轻舟服务网格的无侵入增强 Istio 经验
在云原生社区近日主办的 Service Mesh Summit 2022 服务网格峰会上,网易数帆云原生技术专家方志恒分享了轻舟服务网格无侵入增强 Istio 的经验,本文据此次分享整理,介绍了对无侵 ...
- [oeasy]python0066_控制序列_光标位置设置_ESC_逃逸字符_CSI
光标位置 回忆上次内容 上次讲了 三引号的输出 三引号中 回车和引号 都会 被原样输出 \ 还是需要从 \\转义 黑暗森林 快被摸排清了 还有哪个 转义序列 没 研究过吗? \e是 干什么的? 回忆转 ...
- 题解:AT_arc173_b [ARC173B] Make Many Triangles
背景 前几天打了比赛,崩麻了,所以来水一篇题解.LC真睿智 题意 给你 \(n\) 个点,问最多能组成几个三角形. 分析 听说可以随机化.这道题就是一个简单贪心. 我们考虑,如果没有共线的点,那么答案 ...
- P6680 [CCO2019] Marshmallow Molecules 题解
P6680 题意 一个 \(n\) 点 \(m\) 边的图,图无重边,无自环. 满足这样一条性质:如果三边互不相等,则三边可以构成三角形. 思路 思路简单,用集合的思想来做. 引用一下 K0stlin ...
- LRZ
1.在平面直角坐标系中,已知点 \(A(-2,2).B(3,4).C(0,1)\),直线 \(y=kx+b\) 过点 \(C\) 且与线段 \(AB\) 有交点,则 \(k\) 的取值范围是_____ ...
- 释放资源的方式try-with-resources
1.try-catch-finally 2.try-with-resources 使用方法 try(//这里定义你要使用的资源){} catch(){} 注意:try()里只能存放流对象(资源对象), ...
- 10、SpringMVC之处理Ajax请求
创建名为spring_mvc_ajax的新module,过程参考9.1节和9.5节 10.1.SpringMVC处理Ajax请求 10.1.1.页面请求示例 <input type=" ...