supervisorctl 是 Supervisor 的管理命令行工具,用于控制 Supervisor 管理的进程。下面为您详细解释:
Supervisor 组成
- supervisord: 服务端/守护进程,负责启动和管理子进程
- supervisorctl: 客户端命令行工具,用于控制supervisord 管理的进程
常用 supervisorctl 命令
# 查看所有进程状态
supervisorctl status
# 启动指定程序
supervisorctl start 程序名称
# 停止指定程序
supervisorctl stop 程序名称
# 重启指定程序
supervisorctl restart 程序名称
# 重新加载配置
supervisorctl reload
# 查看所有进程日志
supervisorctl tail -f 程序名称
在 CentOS 7 中配置 Spring Boot 程序
1. 安装 Supervisor
yum install -y supervisor
systemctl enable supervisord
systemctl start supervisord
2. 创建 Spring Boot 配置文件
在 /etc/supervisord.d/目录下创建配置文件,如 myapp.conf:
[program:geomdata-gateway]
directory=/home/project/geomdata/gateway
command=/usr/bin/java -jar -Xms512m -Xmx1024m geomdata-gateway.jar
autostart=true
autorestart=true
startsecs=10
startretries=3
user=root
stdout_logfile=/var/log/supervisor/geomdata-gateway.log
stdout_logfile_maxbytes=50MB
stdout_logfile_backups=10
redirect_stderr=true
environment=JAVA_HOME="/home/jdk-21.0.9",PATH="/home/jdk-21.0.9/bin:%(ENV_PATH)s"
3. 使用 supervisorctl 管理
# 重新加载配置
supervisorctl reread
supervisorctl update
# 启动 Spring Boot 应用
supervisorctl start my-springboot-app
# 查看状态
supervisorctl status
# 输出示例:my-springboot-app RUNNING pid 12345, uptime 0:10:00
# 查看日志
supervisorctl tail -f my-springboot-app
4. 配置 Jenkins 用户权限
为了让 Jenkins 用户可以执行 sudo supervisorctl命令,需要配置 sudo 权限:
# 编辑 sudoers 文件
sudo visudo
在文件末尾添加:
# Jenkins 用户可以在不输入密码的情况下执行 supervisorctl
jenkins ALL=(ALL) NOPASSWD: /usr/bin/supervisorctl
注意:如果您的 Jenkins 以其他用户运行,请替换 jenkins为实际用户。
5. 验证安装
# 检查 Supervisor 服务状态
sudo systemctl status supervisord
# 检查 Supervisor 版本
supervisorctl --version
# 查看所有进程状态
sudo supervisorctl status
备用方案:如果没有安装 Supervisor
如果您不想使用 Supervisor,可以修改脚本使用 systemd 或其他方式管理服务:
方案1:使用 systemd(如果未安装 Supervisor)
#!/bin/bash
set -e
# 临时切换到 JDK 21
export JAVA_HOME=/home/jdk-21.0.9
export PATH=$JAVA_HOME/bin:$PATH
echo "=== 使用 Java 版本 ==="
java -version
echo "==================="
# 停止服务函数 - 使用 systemctl
function stop_service {
local APP_NAME="$1"
local SERVICE_NAME="$2"
if sudo systemctl is-active --quiet "${SERVICE_NAME}"; then
echo "Stopping ${APP_NAME}..."
sudo systemctl stop "${SERVICE_NAME}"
fi
}
# 启动服务函数 - 使用 systemctl
function start_service {
local APP_NAME="$1"
local SERVICE_NAME="$2"
echo "Starting ${APP_NAME}..."
sudo systemctl start "${SERVICE_NAME}"
sudo systemctl status "${SERVICE_NAME}" --no-pager
}
# 备份和复制函数保持不变
# ...
# 部署函数修改
function deploy_service {
local APP_NAME="$1"
local APP_PATH="$2"
local SERVICE_NAME="geomdata-${APP_NAME#geomdata-}.service" # 生成服务名
backup_file "${APP_NAME}" "${APP_PATH}"
copy_new_jar "${APP_NAME}" "${APP_PATH}"
start_service "${APP_NAME}" "${SERVICE_NAME}"
}
# 停止所有服务
sudo systemctl stop geomdata-auth.service geomdata-gateway.service geomdata-system.service geomdata-metadata.service
# 部署服务...
方案2:使用启动脚本直接管理(最简单)
如果不使用任何进程管理器,可以直接用后台进程方式:
#!/bin/bash
set -e
export JAVA_HOME=/home/jdk-21.0.9
export PATH=$JAVA_HOME/bin:$PATH
echo "=== 使用 Java 版本 ==="
java -version
echo "==================="
# 停止服务 - 通过 kill 进程
function stop_service {
local APP_NAME="$1"
local APP_PATH="$2"
echo "停止 ${APP_NAME}..."
# 查找并杀死相关进程
PID=$(ps aux | grep "${APP_NAME}.jar" | grep -v grep | awk '{print $2}')
if [ -n "$PID" ]; then
kill -9 $PID
echo "已停止进程: $PID"
fi
}
# 启动服务 - 直接运行
function start_service {
local APP_NAME="$1"
local APP_PATH="$2"
echo "启动 ${APP_NAME}..."
cd "${APP_PATH}"
nohup java -jar "${APP_NAME}.jar" > "${APP_NAME}.log" 2>&1 &
echo "启动完成,PID: $!"
}
6. Jenkins项目关键配置


359

被折叠的 条评论
为什么被折叠?



