From a3ed8cac91827e56a0ee9f8e58f79c2e1cbf8b26 Mon Sep 17 00:00:00 2001 From: xc Date: Tue, 21 Oct 2025 11:08:25 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=BF=90=E8=A1=8C=E7=9A=84?= =?UTF-8?q?=E8=84=9A=E6=9C=AC=EF=BC=8C=E5=8F=AF=E4=BB=A5=E5=90=AF=E5=81=9C?= =?UTF-8?q?=E6=9F=A5=E7=9C=8B=E7=8A=B6=E6=80=81=E7=AD=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- aufs/core/sysmonitor.go | 35 ++++----- scagent/run.sh | 163 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 176 insertions(+), 22 deletions(-) create mode 100644 scagent/run.sh diff --git a/aufs/core/sysmonitor.go b/aufs/core/sysmonitor.go index f69737e..8f58cb3 100644 --- a/aufs/core/sysmonitor.go +++ b/aufs/core/sysmonitor.go @@ -6,7 +6,6 @@ import ( "log" "net/http" "net/rpc/jsonrpc" - "time" ) // 返回json数据 @@ -36,44 +35,36 @@ func SysMonitor(w http.ResponseWriter, r *http.Request) { scslist := db.GetlScList(1) // var rsdata Syslist + var sinfo SysInfo // todo 待优化 for _, sc := range scslist { - // 利用channel控制超时 - errch := make(chan error, 1) // 利用jsonrpc 请求结果 // 构建访问的链接 ser := sc.Addr + ":" + sc.Port - go func() { - // 链接服务 - client, err := jsonrpc.Dial("tcp", ser) - // 发生错误,执行下一个 - if err != nil { - log.Fatalf("Dial SysMonitor failed: %v\n", err) - errch <- err - } - // - defer client.Close() + // 链接服务 + client, err := jsonrpc.Dial("tcp", ser) + // 发生错误,执行下一个 + if err != nil { + log.Fatalf("Dial SysMonitor failed: %v\n", err) + } + // + defer client.Close() + if client != nil { // 返回的是pb字符串 var resp string // 调用远程方法 SysmonitorService.GetSysInfo client.Call("SysmonitorService.GetSysInfo", nil, &resp) // 构建json结构的字符串 - sinfo := SysInfo{ + sinfo = SysInfo{ Addr: sc.Addr, Port: sc.Port, Resp: resp, } // 添加到rsdata rsdata.Slist = append(rsdata.Slist, sinfo) - }() - - // - select { - case err := <-errch: - log.Printf("SysMonitor failed: %v\n", err) - case <-time.After(5 * time.Second): - log.Printf("SysMonitor timeout: %v\n", ser) + } else { + continue } } diff --git a/scagent/run.sh b/scagent/run.sh new file mode 100644 index 0000000..849e114 --- /dev/null +++ b/scagent/run.sh @@ -0,0 +1,163 @@ +#!/bin/bash + +# scagent 服务管理脚本 +# 用于启动、停止、重启和检查 scagent 服务状态 + +# 服务名称 +APP_NAME="scagent" +# 可执行文件路径 +APP_PATH="./scagent" +# PID文件路径 +PID_FILE="./${APP_NAME}.pid" +# 日志文件路径 +LOG_FILE="./${APP_NAME}.log" + +# 检查程序是否存在 +check_app_exists() { + if [ ! -f "$APP_PATH" ]; then + echo "错误: 程序 $APP_PATH 不存在,请先编译!" + exit 1 + fi +} + +# 检查程序是否在运行 +is_running() { + if [ -f "$PID_FILE" ]; then + PID=$(cat $PID_FILE) + if ps -p $PID > /dev/null 2>&1; then + return 0 # 运行中 + else + # PID文件存在但进程不存在,删除PID文件 + rm -f $PID_FILE + fi + fi + return 1 # 未运行 +} + +# 启动服务 +start() { + check_app_exists + + if is_running; then + echo "$APP_NAME 服务已经在运行中!" + exit 0 + fi + + echo "正在启动 $APP_NAME 服务..." + + # 以守护进程方式启动应用 + nohup $APP_PATH -d > $LOG_FILE 2>&1 & + + # 记录PID + echo $! > $PID_FILE + + sleep 2 + + if is_running; then + echo "$APP_NAME 服务启动成功!" + echo "PID: $(cat $PID_FILE)" + else + echo "$APP_NAME 服务启动失败!" + exit 1 + fi +} + +# 停止服务 +stop() { + if ! is_running; then + echo "$APP_NAME 服务未运行!" + exit 0 + fi + + echo "正在停止 $APP_NAME 服务..." + + PID=$(cat $PID_FILE) + kill -15 $PID # 发送 SIGTERM 信号 + + # 等待进程终止 + wait_time=0 + max_wait=10 + while is_running && [ $wait_time -lt $max_wait ]; do + sleep 1 + wait_time=$((wait_time + 1)) + echo -n "." + done + echo + + if is_running; then + echo "强制终止 $APP_NAME 服务..." + kill -9 $PID + rm -f $PID_FILE + else + rm -f $PID_FILE + echo "$APP_NAME 服务已停止!" + fi +} + +# 重启服务 +restart() { + echo "正在重启 $APP_NAME 服务..." + stop + sleep 2 + start +} + +# 查看状态 +status() { + if is_running; then + echo "$APP_NAME 服务正在运行中" + echo "PID: $(cat $PID_FILE)" + else + echo "$APP_NAME 服务未运行" + fi +} + +# 查看日志 +tail_log() { + if [ -f "$LOG_FILE" ]; then + tail -f $LOG_FILE + else + echo "日志文件不存在: $LOG_FILE" + fi +} + +# 显示帮助信息 +usage() { + echo "使用方法: $0 {start|stop|restart|status|log}" + echo " start 启动服务" + echo " stop 停止服务" + echo " restart 重启服务" + echo " status 查看服务状态" + echo " log 查看日志输出" +} + +# 检查参数 +if [ $# -eq 0 ]; then + usage + exit 1 +fi + +# 根据参数执行相应的命令 +case "$1" in + start) + start + ;; + stop) + stop + ;; + restart) + restart + ;; + status) + status + ;; + log) + tail_log + ;; + *) + usage + exit 1 + ;; +esac + +exit 0