跳至主要內容

进程相关

chanchaw大约 1 分钟shell脚本

概述

通过端口号查询获取可执行文件所在目录以及启动时的参数,可同时兼容是否 java 进程

#!/bin/bash
# 文件名建议: port-pid-cmd.sh
# 用法:   sudo bash port-pid-cmd.sh 8080
#         或 chmod +x port-pid-cmd.sh 后   sudo ./port-pid-cmd.sh 8080

if [ $# -ne 1 ]; then
    echo "用法: $0 端口号"
    echo "示例:"
    echo "  sudo $0 8080"
    echo "  sudo $0 443"
    exit 1
fi

PORT="$1"

echo "正在查找监听端口 :$PORT 的进程..."

# 优先使用 ss(CentOS 7 默认有)
pid=$(sudo ss -ltnp "sport = :$PORT" | grep -oP 'pid=\K\d+' | head -n 1 2>/dev/null)

if [ -z "$pid" ]; then
    # fallback netstat
    pid=$(sudo netstat -tunlp | grep -w ":$PORT" | awk '{print $NF}' | cut -d/ -f1 | head -n 1 2>/dev/null)
fi

if [ -z "$pid" ] || ! [[ "$pid" =~ ^[0-9]+$ ]]; then
    echo "× 没有找到监听 $PORT 端口的进程"
    exit 1
fi

echo "√ 找到进程 PID: $pid"
echo ""

# =============================================

# 可执行文件路径(最可靠的方式)
exe=$(sudo readlink -f /proc/$pid/exe 2>/dev/null)

if [ -n "$exe" ]; then
    echo "可执行文件 : $exe"
    echo "所在目录   : $(dirname "$exe")"
else
    echo "警告:无法读取可执行文件路径(可能已被删除或权限不足)"
fi

echo ""

# 完整命令行参数
cmdline=$(sudo tr '\0' ' ' < /proc/$pid/cmdline 2>/dev/null | sed 's/  */ /g')

if [ -n "$cmdline" ]; then
    echo "启动命令及参数:"
    echo "  $cmdline"
else
    echo "警告:无法读取命令行参数(可能权限不足)"
fi

echo ""

# 附加信息
echo "进程简要信息:"
ps -ww -p "$pid" -o pid,ppid,user,%cpu,%mem,lstart,cmd --no-headers 2>/dev/null || {
    echo "(ps 输出失败,可能权限不足)"
}

echo ""
echo "完成。"

执行方法 ./find_proc.sh 8084