You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CentOS 8环境下pkill无法杀死productivity进程问题求助

问题原因

你遇到的pkill无法匹配进程的核心原因是pkill默认仅匹配进程短名称(存储在/proc/[pid]/comm中,最大长度15字符),而你通过exec -a productivity修改的是进程的命令行参数前缀,实际进程的短名称还是java,因此默认pkill productivity无法匹配到目标进程。
另外你当前的启动命令存在参数顺序错误:JVM参数-Dkeystore.location需要放在-jar之前才会生效,你现在的写法相当于把该参数传递给jar包主程序,JVM不会读取该配置,你的ssl证书配置此前实际未生效。

解决方案

方案1:修改pkill匹配规则

给pkill增加-f参数,让其匹配完整命令行内容,即可正确识别到目标进程:

pkill -f "productivity"

如果担心误杀其他包含productivity关键词的进程,可以进一步缩小匹配范围:

pkill -f "java -jar productivity.jar"

方案2:使用PID文件管理进程(更稳定,推荐)

修改你的restart-productivity.sh脚本,通过PID文件记录进程ID,重启时直接读取PID销毁进程,完全避免匹配错误问题,同时修复JVM参数顺序问题:

#!/bin/sh
# 销毁旧进程
PID_FILE="/var/run/productivity.pid"
if [ -f "$PID_FILE" ]; then
    OLD_PID=$(cat "$PID_FILE")
    # 正常发送终止信号
    kill "$OLD_PID"
    # 等待最多5秒让进程优雅退出
    for i in 1 2 3 4 5; do
        if ! ps -p "$OLD_PID" > /dev/null; then
            break
        fi
        sleep 1
    done
    # 仍未退出则强制销毁
    if ps -p "$OLD_PID" > /dev/null; then
        kill -9 "$OLD_PID"
    fi
    rm -f "$PID_FILE"
fi

# 启动新进程,修复JVM参数顺序,写入PID文件
bash -c "exec -a productivity java -Dkeystore.location=./ssl/productivity.to.keystore -jar productivity.jar . & echo \$! > $PID_FILE & disown &"

验证方法

执行pgrep -f productivity如果返回目标进程的PID,说明匹配规则生效,脚本可以正常运行。

内容的提问来源于stack exchange,提问作者nykon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 06:45:00