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
相关产品推荐
相关产品推荐

