从手动kill到一键管理:我写了个多关键词进程终止脚本,运维效率直接拉满
从手动kill到一键管理:我写了个多关键词进程终止脚本,运维效率直接拉满
作为一名经常和服务器打交道的开发者,你一定遇到过这些场景:
想杀个Java应用进程,ps -ef | grep
输出一堆结果,翻半天找不到目标;明明要杀开发环境的ruiyi_oss
,却差点误触生产环境的进程;多进程场景下,复制PID、执行kill -9
,步骤繁琐还容易出错。
为了解决这些痛点,我花了半天时间写了一个多关键词交互式进程终止脚本——kill_process.sh
。从单参数匹配到多关键词精确筛选,从固定选项到交互式选择,这个脚本帮我把进程管理的效率提升了至少3倍。今天就来聊聊这个脚本的开发思路和使用场景。
一、脚本核心功能:不止是“杀进程”
先放个最终版脚本的核心能力清单,看看它能不能解决你的痛点:
- 多关键词精确匹配:支持1个或多个关键词(如应用名+环境+端口),进程需同时包含所有关键词才会被匹配,告别“大海捞针”;
- 交互式安全操作:多进程时可选择“全部杀死”“单个杀死”或“取消操作”,每步操作需确认,杜绝误杀;
- 输入即确认:无需按回车,输入选项后自动响应,操作行云流水;
- 完善的状态反馈:查询进程、杀死进程、二次校验,每个步骤都有明确提示,结果一目了然;
- 详细帮助文档:执行
./kill_process.sh -h
,从参数说明到使用示例,新手也能快速上手。
二、为什么需要这个脚本?对比传统方式
举个实际场景:我要终止“ruiyi_oss
应用、dev
环境、运行在9660
端口”的进程。
传统操作步骤:
- 执行
ps -ef | grep ruiyi_oss
,从一堆结果里找包含dev
和9660
的进程; - 复制目标进程的PID(比如
2768130
); - 执行
kill -9 2768130
; - 再次执行
ps -ef | grep ruiyi_oss
,确认进程是否已终止。
问题:步骤多、易出错,若有多个进程,需重复复制PID,效率极低。
用kill_process.sh
的操作步骤:
- 执行
./kill_process.sh ruiyi_oss dev 9660
; - 脚本自动筛选出同时包含这3个关键词的进程,显示序号和详情;
- 输入
s
选择“单个杀死”,再输入进程对应序号,最后输入y
确认; - 脚本自动执行
kill -9
并二次校验,输出“成功杀死”结果。
优势:4步变1步,无需复制粘贴,每步有提示,安全性和效率双提升。
三、脚本核心设计思路
1. 多关键词匹配:如何实现“与逻辑”筛选?
脚本的核心是多关键词“与”匹配——进程命令必须同时包含所有输入的关键词。实现这个逻辑的关键是构造正则表达式。
比如输入ruiyi_oss dev 9660
三个关键词,脚本会自动构造如下正则:
ruiyi_oss.*dev.*9660
含义是:进程命令中需先出现ruiyi_oss
,之后出现dev
,最后出现9660
(顺序可调整,用.*
匹配中间任意字符)。
同时,为了避免关键词中的特殊字符(如.
、*
)影响正则匹配,脚本会对关键词进行转义处理:
escaped_key=$(echo "$key" | sed 's/[.[\*^$+?{}()|]/\\&/g')
2. 交互式选择:如何兼顾“便捷”与“安全”?
多进程场景下,最怕“一刀切”全部杀死。脚本设计了三层安全机制:
- 选项拆分:提供
a
(全部杀死)、s
(单个杀死)、c
(取消)三个选项,覆盖所有场景; - 二次确认:选择“全部杀死”或“单个杀死”后,需输入
y
确认,其他任何输入均视为取消; - 输入即确认:用
read -r -n 1
实现“输入1个字符即响应”,无需按回车,兼顾便捷性和安全性。
核心代码片段:
echo -e "${YELLOW}发现多个进程(共$pid_count个),请选择操作:${NC}"
echo -e "${YELLOW}a) 全部杀死(输入a或1)${NC}"
echo -e "${YELLOW}s) 选择单个杀死(输入s或2)${NC}"
echo -e "${YELLOW}c) 取消操作(输入c或3)${NC}"
read -r -n 1 choice # 输入1个字符即响应
3. 状态校验:如何确保进程真的被杀死?
杀死进程后,脚本会再次执行进程查询,确认目标进程是否已终止:
# 二次检测进程是否存在
result_after=$(get_process_info)
pids_after=$(echo "$result_after" | awk -v RS="__PID__" 'NR==2 {print $0}')
if [ -z "$pids_after" ]; thenecho -e "${GREEN}成功:所有目标进程已被杀死${NC}"
elseecho -e "${RED}警告:仍有残留进程(PID:$pids_after),可能未完全终止${NC}"
fi
这个步骤避免了“kill命令执行成功但进程未终止”的隐性问题,比如进程处于“僵尸状态”或权限不足。
四、脚本使用全指南
1. 基础准备
- 保存脚本:将下面的完整脚本保存为
kill_process.sh
; - 赋予权限:执行
chmod +x kill_process.sh
,让脚本可执行; - 查看帮助:执行
./kill_process.sh -h
,查看详细使用说明。
2. 常见使用场景
场景1:单关键词匹配(杀死所有ruiyi_oss
相关进程)
./kill_process.sh ruiyi_oss
脚本会筛选出所有包含ruiyi_oss
的进程,若有多个,可选择“全部杀死”或“单个杀死”。
场景2:双关键词匹配(杀死dev
环境的user-service
进程)
./kill_process.sh user-service dev
仅匹配同时包含user-service
和dev
的进程,精准定位开发环境应用。
场景3:多关键词匹配(杀死prod
环境、9090
端口的order
服务)
./kill_process.sh order prod 9090
三关键词“与”匹配,适用于复杂场景下的精确筛选。
3. 交互流程演示
以“双关键词匹配多进程”为例,完整交互流程如下:
$ ./kill_process.sh ruiyi_oss dev
正在查询包含所有关键词[ruiyi_oss dev]的进程...查询到的进程信息(包含所有关键词[ruiyi_oss dev]):
----------------------------------------
1 root 2768130 1 49 02:01 ? 00:01:59 java -jar /niudun/app/ruiyi_oss_dev/ruiyi_oss.jar --spring.profiles.active=dev
2 root 2769000 1 30 02:10 ? 00:00:30 java -jar /niudun/app/ruiyi_oss_dev/ruiyi_oss_2.jar --spring.profiles.active=dev
----------------------------------------发现多个进程(共2个),请选择操作:
a) 全部杀死(输入a或1)
s) 选择单个杀死(输入s或2)
c) 取消操作(输入c或3)
请输入选项(输入后自动确认):
s请输入要杀死的进程序号(1-2),输入'q'退出(输入后自动确认):
1确认杀死进程(PID: 2768130)?[