使用Arthas远程更新Class
使用命令:bash main.sh ./config.sh <Class文件路径>
REMOTE_USER="admin" # 服务器用户名
REMOTE_HOST="*.*.*.*" # 服务器地址
REMOTE_DIR="/tmp" # 服务器上传目录,建议使用临时目录
REMOTE_PASSWORD="***" # 服务器登录密码
REMOTE_PORT=22 # 服务器端口
REMOTE_ARTHAS_DIR="{arthas-dir}" # arthas目录
PROJECT_NAME="{jar-keyword}" # 服务器上的jar包名,模糊匹配
# 检查输入参数
if [[ $# -lt 1 ]]; then
echo "Usage: $0 <config-file> [CLASS_SRC]"
exit 1
fi
CONFIG_FILE=$1
CLASS_SRC=$2
# 检查配置文件是否存在
if [[ ! -f $CONFIG_FILE ]]; then
echo "Configuration file $CONFIG_FILE does not exist!"
exit 1
fi
# 加载配置文件
source "$CONFIG_FILE"
# 如果 CLASS_SRC 为空,使用配置文件中定义的 CLASS_SRC 默认值
if [[ -z $CLASS_SRC ]]; then
CLASS_SRC="$CLASS_SRC_DEFAULT"
fi
# 校验 CLASS_SRC 是否存在
if [[ ! -f $CLASS_SRC ]]; then
echo "Error: CLASS_SRC file does not exist: $CLASS_SRC"
exit 1
fi
# 加载公共逻辑脚本
source "$(dirname "$0")/common.sh"
# 解析 Class 名称
CLASS_NAME=$(basename "$CLASS_SRC")
echo "Using CLASS_NAME: $CLASS_NAME"
# 执行上传
echo "Uploading $CLASS_NAME to server $REMOTE_HOST..."
sshpass -p "$REMOTE_PASSWORD" scp -P "$REMOTE_PORT" "$CLASS_SRC" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/"
echo "Upload success..."
# 执行热更新
echo "Running hot update on server $REMOTE_HOST..."
sshpass -p "$REMOTE_PASSWORD" ssh -p "$REMOTE_PORT" "$REMOTE_USER@$REMOTE_HOST" << EOF
PID=\$(jps | grep "$PROJECT_NAME" | awk '{print \$1}')
if [ -n "\$PID" ]; then
echo "Found $PROJECT_NAME process ID: \$PID"
java -jar $REMOTE_ARTHAS_DIR/arthas-boot.jar \$PID << END
retransform $REMOTE_DIR/$CLASS_NAME
exit
END
echo "Completed hot update for $CLASS_NAME"
else
echo "No matching $PROJECT_NAME process found on $REMOTE_HOST."
fi
EOF