当前位置: 代码网 > 服务器>服务器>Linux > Linux使用pkill清理各种服务进程的方法大全

Linux使用pkill清理各种服务进程的方法大全

2025年12月29日 Linux 我要评论
通过 pkill 清理不同类型的服务进程需要根据进程特征进行精确匹配。本文介绍各种服务的清理方法:1. java -jar 启动的服务精确匹配特定的jar包:# 方法1:通过jar包名匹配pkill

通过 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清理各种服务进程的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com