Linux

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > Linux > Linux pkill清理各种服务进程

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

作者:学亮编程手记

这篇文章主要介绍了如何使用pkill命令清理不同类型的服务器进程,包括Java-jar、Redis、Elasticsearch、Nginx等服务的清理方法,同时,还提供了通用的安全清理策略,如按用户、端口或组合匹配清理,并建议使用脚本和进程管理工具来实现更安全和高效的清理

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

您可能感兴趣的文章:
阅读全文