进程相关
大约 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
