通过 pkill 清理不同类型的服务进程需要根据进程特征进行精确匹配。本文介绍各种服务的清理方法:
1. java -jar 启动的服务
精确匹配特定的jar包:
# 方法1:通过jar包名匹配 pkill -f 'myapp.jar' # 方法2:通过主类名匹配 pkill -f 'com.example.mainclass' # 方法3:通过应用名匹配(在启动时指定) # java -dapp.name=myapp -jar myapp.jar pkill -f 'app.name=myapp'
清理所有java进程(不推荐,太暴力):
# 谨慎使用!会杀掉所有java进程 pkill -9 java pkill -9 javaw
2. redis 二进制启动的服务
# 方法1:通过进程名(redis-server通常作为服务名) pkill redis-server # 方法2:通过配置文件路径(如果通过配置文件启动) pkill -f 'redis-server.*/path/to/redis.conf' # 方法3:通过端口(如果固定端口) pkill -f 'redis-server.*:6379' # 方法4:优雅关闭(发送shutdown信号) redis-cli -p 6379 shutdown
3. elasticsearch 服务
# 方法1:通过es进程名
pkill -f elasticsearch
# 方法2:通过java进程的es特征
pkill -f 'org.elasticsearch.bootstrap.elasticsearch'
# 方法3:通过pid文件(推荐方式)
if [ -f /var/run/elasticsearch/elasticsearch.pid ]; then
kill $(cat /var/run/elasticsearch/elasticsearch.pid)
fi
# 方法4:通过es的专用停止脚本(如果有)
/path/to/elasticsearch/bin/elasticsearch -d -p pid
kill $(cat pid)
4. nginx 服务
# 方法1:优雅停止(推荐)
nginx -s quit
# 方法2:快速停止
nginx -s stop
# 方法3:使用pkill(根据进程名)
pkill nginx
# 方法4:杀掉master和worker进程
pkill -9 nginx
# 方法5:通过pid文件
if [ -f /run/nginx.pid ]; then
kill $(cat /run/nginx.pid)
fi
5. 通用的安全清理策略
方案1:按用户清理(如果服务运行在特定用户下)
# 清理www用户的所有进程 pkill -u www # 清理特定用户下的java进程 pkill -u appuser -f java
方案2:按端口清理
# 清理占用8080端口的进程 fuser -k 8080/tcp # 或者使用更直接的方法 kill $(lsof -t -i:8080)

方案3:组合匹配,精确清理
# 清理包含特定关键词的java进程 pkill -f 'java.*myapp' # 清理除了特定进程外的所有java进程 pgrep -f java | grep -v $(pgrep -f 'important-app') | xargs kill
6. 封装成脚本的完整方案
#!/bin/bash
# 文件名:service_cleaner.sh
# 颜色输出
red='\033[0;31m'
green='\033[0;32m'
yellow='\033[1;33m'
nc='\033[0m'
clean_service() {
local service_name=$1
local pattern=$2
echo -e "${yellow}清理 $service_name 服务...${nc}"
# 查找进程
pids=$(pgrep -f "$pattern")
if [ -z "$pids" ]; then
echo -e "${green}$service_name 服务未运行${nc}"
return 0
fi
# 显示进程信息
echo "找到进程: $pids"
ps -fp $pids | tail -n +2
# 发送sigterm信号(优雅关闭)
echo "发送优雅关闭信号..."
kill $pids 2>/dev/null
# 等待最多10秒
for i in {1..10}; do
if ! pgrep -f "$pattern" > /dev/null; then
echo -e "${green}$service_name 已成功停止${nc}"
return 0
fi
sleep 1
done
# 强制关闭
echo "强制关闭..."
kill -9 $pids 2>/dev/null
sleep 1
if pgrep -f "$pattern" > /dev/null; then
echo -e "${red}警告: 仍有 $service_name 进程在运行${nc}"
return 1
else
echo -e "${green}$service_name 已强制停止${nc}"
return 0
fi
}
# 清理各种服务
echo -e "\n${yellow}=== 开始清理服务 ===${nc}"
# redis
clean_service "redis" "redis-server"
# elasticsearch
clean_service "elasticsearch" "org.elasticsearch.bootstrap.elasticsearch"
# nginx
clean_service "nginx" "nginx:"
# java应用(根据实际情况调整模式)
clean_service "myjavaapp" "myapp.jar"
clean_service "springboot" "spring-boot"
# 其他端口占用清理
echo -e "\n${yellow}=== 清理端口占用 ===${nc}"
for port in 8080 9200 9300 6379 80 443; do
pid=$(lsof -t -i:$port 2>/dev/null)
if [ ! -z "$pid" ]; then
echo "清理端口 $port 的进程: $pid"
kill $pid 2>/dev/null
fi
done
echo -e "\n${yellow}=== 最终状态检查 ===${nc}"
ps aux | grep -e 'redis|elasticsearch|nginx|java.*jar' | grep -v grep
echo -e "\n${green}清理完成!${nc}"
7. 一键清理所有开发环境服务
#!/bin/bash
# dev_cleanup.sh - 清理开发环境服务
# 停止所有服务
echo "停止所有开发服务..."
# docker服务
docker-compose down 2>/dev/null
# redis
redis-cli shutdown 2>/dev/null || pkill redis-server
# elasticsearch
pkill -f elasticsearch
# nginx
nginx -s stop 2>/dev/null || pkill nginx
# java服务(按特定模式)
pkill -f 'java.*\.jar'
# 数据库
brew services stop mysql 2>/dev/null # macos homebrew
systemctl stop mysql 2>/dev/null # linux systemd
# 检查清理结果
echo -e "\n剩余相关进程:"
ps aux | grep -e 'redis|elastic|nginx|java.*jar|mysql|mongo' | grep -v grep
# 清理端口占用
echo -e "\n释放常用端口..."
for port in 8080 8081 3000 4200 6379 9200 9300 3306 27017; do
fuser -k $port/tcp 2>/dev/null
done
8. 最佳实践建议
优先使用专用停止命令:
# 优于 pkill nginx -s quit redis-cli shutdown
创建服务启动/停止脚本:
# start_services.sh #!/bin/bash nohup java -jar app.jar > app.log 2>&1 & redis-server /etc/redis.conf & # stop_services.sh #!/bin/bash pkill -f 'app.jar' redis-cli shutdown
使用进程管理工具:
# 使用supervisor sudo supervisorctl stop all # 使用systemd sudo systemctl stop nginx redis elasticsearch
安全检查后再清理:
# 确认进程 ps aux | grep -e 'java.*jar|redis|nginx' # 确认端口 ss -tuln | grep -e ':(8080|6379|80)'
以上就是linux使用pkill清理各种服务进程的方法大全的详细内容,更多关于linux pkill清理各种服务进程的资料请关注代码网其它相关文章!
发表评论