当前位置: 首页 > news >正文

Go编写服务监管程序

前言

        程序的目的:一个基于Linux系统下的进程监控与管理工具,它能够监控指定的进程或服务的运行情况,并在发现它们不存在或出现异常时自动进行重启操作。这个程序就像一个可靠的看门狗,时刻守护着系统的稳定运行。

        程序的本身是周期性通过命令获得程序状态,如果异常,执行指定的重启命令,并发送邮件。公司之前有过Java版本、QT版本的服务监控程序,现在提供GO语言版本。这个demo会涉及到结构体转换、读取json文件、发送邮箱、执行cmd命令、定时器、远程登录ssh等。

程序思路

1、新建host.json文件。存放服务器信息、服务监听命令、服务重启命令

2、编写 mailSend.go 用于发送邮件

3、编写 constant.go 用于结构体和常量

4、编写ReadFile方法、LocalExec方法、ssh登录方法等

核心代码

配置文件host.json

[{"sshHost": "127.0.0.1",   "sshUser": "",    "sshStatus": 1,    "sshPassword": "",   "sshType": "local",    "sshKeyPath": "",    "sshPort": 22,    "monitors": [{"name": "道闸后台java服务",       "type": "java",        "status": 1,        "findCmd": "ps -ef|grep test",        "keyword": "test.jar",        "starCmd": "nohup java -jar /home/test.jar >/dev/null  2>&1 &",        "fileDir": "/home/test.jar"      },      {"name": "docker nginx_server 服务",        "type": "docker",        "status": 0,        "findCmd": "docker ps|grep nginx_server",        "keyword": "Up",        "starCmd": "docker restart nginx_server",        "fileDir": ""      },]}
]

邮箱 mailSend.go

package constantimport ("gopkg.in/gomail.v2"    "strconv")func SendMailSelf(body string) {userName := "XXX@163.com"    authCode := "XXX"    host := "smtp.163.com"    portStr := "465"    mailTo := "XXX@qq.com"    sendName := "XXX@163.com"    subject := "服务器重启"    SendMail(userName, authCode, host, portStr, mailTo, sendName, subject, body)
}func SendMail(userName, authCode, host, portStr, mailTo, sendName string, subject, body string) error {port, _ := strconv.Atoi(portStr)m := gomail.NewMessage()m.SetHeader("From", m.FormatAddress(userName, sendName))m.SetHeader("To", mailTo)m.SetHeader("Subject", subject)m.SetBody("text/html", body)d := gomail.NewDialer(host, port, userName, authCode)err := d.DialAndSend(m)return err
}

核心方法 PasswordSsh

        此方法使用golang.org/x/crypto/ssh,远程登录服务器执行相关命令。此监管程序可以放在本地或者其他服务器,不在依赖当前的操作系统,即可监控所有的服务。

// PasswordSsh 用于登录ssh 
PasswordSsh(hostConfig *constant.SshConfig) {//创建ssh登陆配置    config := &ssh.ClientConfig{Timeout:         time.Second, //ssh 连接time out 时间一秒钟, 如果ssh验证错误 会在一秒内返回       User:            hostConfig.SshUser,       HostKeyCallback: ssh.InsecureIgnoreHostKey(), //这个可以, 但是不够安全       //HostKeyCallback: hostKeyCallBackFunc(h.Host),    }if hostConfig.SshType == "password" {config.Auth = []ssh.AuthMethod{ssh.Password(hostConfig.SshPassword)}} else {config.Auth = []ssh.AuthMethod{publicKeyAuthFunc(hostConfig.SshKeyPath)}}//dial 获取ssh client    addr := fmt.Sprintf("%s:%d", hostConfig.SshHost, hostConfig.SshPort)sshClient, err := ssh.Dial("tcp", addr, config)if err != nil {log.Fatal("创建ssh client 失败", err)}defer sshClient.Close()// 循环监控具体程序命令    for _, ServerItem := range hostConfig.Monitors {if ServerItem.Status == 1 {//创建ssh-session          session, err := sshClient.NewSession()if err != nil {log.Fatal("创建ssh session 失败", err)}defer session.Close()//执行远程命令          combo, err := session.CombinedOutput(ServerItem.FindCmd)if err != nil {log.Fatal("远程执行cmd 失败", err)}fmt.Println(string(combo))isStart := strToArr(string(combo), ServerItem.Keyword)fmt.Printf("this %s need restart :%v\n", ServerItem.Name, isStart)if isStart {//创建ssh-session             session, err := sshClient.NewSession()if err != nil {log.Fatal("创建ssh session 失败", err)}defer session.Close()session.CombinedOutput(ServerItem.StarCmd)log.Println("重启命令输出:", string(combo))// 发送邮箱             constant.SendMailSelf(ServerItem.StarCmd)}}}
}

github地址

https://github.com/cfh123/go-regulatory-procedures

相关文章:

Go编写服务监管程序

前言 程序的目的:一个基于Linux系统下的进程监控与管理工具,它能够监控指定的进程或服务的运行情况,并在发现它们不存在或出现异常时自动进行重启操作。这个程序就像一个可靠的看门狗,时刻守护着系统的稳定运行。 程序的本身是周期…...

API商品详情:详尽呈现产品信息的利器

API商品详情:详尽呈现产品信息的利器 随着电子商务的迅速发展,越来越多的企业和开发者开始关注和利用API来实现灵活、高效的商品展示和推广。而在这一领域中,API商品详情成为了无可替代的利器,为用户提供了极为详尽的产品信息。 …...

Cisco 路由器配置管理

大多数网络中断的最常见原因是错误的配置更改。对网络设备配置的每一次更改都伴随着造成网络中断、安全问题甚至性能下降的风险。计划外更改使网络容易受到意外中断的影响。 Network Configuration Manager 网络更改和配置管理 (NCCM)解决方案&#xff…...

java面试真题附参考答案【下册】

tips:下面简述题为java面试真题,阅读本文且感兴趣的,还有将要面试的小伙伴有条件的准备一下笔和纸,将之转述出来成为自己的知识,希望接下来的面试好运连连 上一册:java面试真题【上册】_CsDn.FF的博客-CSD…...

2023牛客多校第三场 B.Auspiciousness

传送门 前题提要:没得说,赛时根本没想到dp,赛后翻各大题解看了很久,终于懂了dp的做法,故准备写一篇题解. 首先,先定义一下我们的 d p dp dp方程,考虑将处于 [ 1 , n ] [1,n] [1,n]的数当做小数,将处于 [ n 1 , 2 ∗ n ] [n1,2*n] [n1,2∗n]的数当做大数.那么对于我们的摸牌结…...

Numpy—数组的分隔与转置

⛳数组的切分 split 分隔 numpy.split 函数沿特定 的轴将数组分割为子数组,格式如下: numpy.split(ary, indices_or_sections, axis)参数说明: arry:被分割的数组。indices_or_sections:如果是一个整数,就…...

PyTorch中级教程:深入理解自动求导和优化

在你已经掌握了如何使用PyTorch构建神经网络的基础上,接下来我们将深入探讨PyTorch的两个核心特性:自动求导(Autograd)和优化(Optimization)。这两个特性在深度学习模型的训练过程中起着至关重要的作用。 …...

ES6基础知识六:你是怎么理解ES6中 Promise的?使用场景?

一、介绍 Promise,译为承诺,是异步编程的一种解决方案,比传统的解决方案(回调函数)更加合理和更加强大 在以往我们如果处理多层异步操作,我们往往会像下面那样编写我们的代码 doSomething(function(resu…...

数据库CAST()函数,格式(CAST AS decimal)

语法: CAST (expression AS data_type) 参数说明: expression:任何有效的SQServer表达式。 AS:用于分隔两个参数,在AS之前的是要处理的数据,在AS之后是要转换的数据类型。 data_type:目标系统…...

LRU 缓存结构

文章目录 LRU实现 LRU 优先去除最久没有访问到的数据。 实现 通过组合哈希表(Hash Table)和双向链表(Doubly Linked List)实现 LRU 缓存。并且以 O(1) 的时间复杂度执行 get 和 put 操作核心是对节点的新增、访问都会让节点移动…...

DAY1,Qt [ 手动实现登录框(信息调试类,按钮类,行编辑器类,标签类的使用)]

1.手动实现登录框&#xff1b; ---mychat.h---头文件 #ifndef MYCHAT_H #define MYCHAT_H#include <QWidget> #include <QDebug> //打印信息 #include <QIcon> //图标 #include <QPushButton> //按钮 #include <QLineEdit> //行编辑器类 #in…...

25.8 matlab里面的10中优化方法介绍—— 拉各朗日乘子法求最优化解(matlab程序)

1.简述 拉格朗日乘子法&#xff1a; 拉格朗日乘子法&#xff08;Lagrange multipliers&#xff09;是一种寻找多元函数在一组约束下的极值的方法。通过引入拉格朗日乘子&#xff0c;可将有 变量与 约束条件的最优化问题转化为具有变量的无约束优化问题求解 举个例子&#xff…...

2023年自然语言处理与信息检索国际会议(ECNLPIR 2023) | EI Compendex, Scopus双检索

会议简介 Brief Introduction 2023年自然语言处理与信息检索国际会议(ECNLPIR 2023) 会议时间&#xff1a;2023年9月22日-24日 召开地点&#xff1a;中国杭州 大会官网&#xff1a;ECNLPIR 2023-2023 Eurasian Conference on Natural Language Processing and Information Retr…...

Python - 嵌入式数据库Sqlite3的基本使用

SQLite是一种轻量级的嵌入式关系型数据库管理系统&#xff0c;而Python标准库中提供了与SQLite交互的模块&#xff0c;sqlite3。下面是一个Python 3中使用sqlite3模块的详细示例与解析。 import sqlite3 # 创建或连接数据库 conn sqlite3.connect(example.db) # 创建一个…...

VB制作网页自动填表

VB制作简单模拟器教程入门版 第一讲 如何用VB编程打开一个网页&#xff1a; 由于是为做模拟器做铺垫&#xff0c;所以就不介绍别的方法&#xff0c;只介绍一种最简单的用webbrowser控件实现&#xff08;实际是其他的方法我还没有学会&#xff09;。 下面我们就开始步入模…...

Kotlin 和 Java对比,具体代码分析

目录 一、语法比较二、案列分析 Kotlin 和 Java 都是广泛使用的编程语言&#xff0c;它们有一些共同点&#xff0c;例如都追求面向对象编程&#xff0c;但也有许多不同之处。下面是 Kotlin 和 Java 之间的一些比较&#xff1a; 一、语法比较 声明变量&#xff1a;Kotlin 使用 …...

目标检测之3维合成

现在有一系列的图片&#xff0c;图片之间可以按照z轴方向进行排列。图片经过了目标检测&#xff0c;输出了一系列的检测框&#xff0c;现在的需求是将检测框按类别进行合成&#xff0c;以在3维上生成检测结果。 思路&#xff1a;将图片按照z轴方向排列&#xff0c;以z轴索引作…...

【playbook】Ansible的脚本----playbook剧本

Ansible的脚本----playbook剧本 1.playbook剧本组成2.playbook剧本实战演练2.1 实战演练一&#xff1a;给被管理主机安装Apache服务2.2 实战演练二&#xff1a;使用sudo命令将远程主机的普通用户提权为root用户2.3 实战演练三&#xff1a;when条件判断指定的IP地址2.4 实战演练…...

PySpark基本操作:如何查看源码

方法一&#xff1a; from pyspark.mllib.tree import GradientBoostedTrees import inspectsource_code inspect.getsource(GradientBoostedTrees) print(source_code) 方法二&#xff1a; GradientBoostedTrees — PySpark 3.4.1 documentation (apache.org) 在官网中&…...

HCIP——OSPF的防环机制

OSPF的防环机制 一、域间防环二、域内防环有向图转化1、有向图的画法2、示例&#xff1a; 三、SPF算法 OSPF将整个OSPF域划分为多个区域&#xff0c;区域内部通过拓扑信息计算路由&#xff0c;区域间传递路由信息&#xff0c;实现全网可达。OSPF防环机制主要是体现在域内防环和…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…...

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

【Java学习笔记】BigInteger 和 BigDecimal 类

BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点&#xff1a;传参类型必须是类对象 一、BigInteger 1. 作用&#xff1a;适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

服务器--宝塔命令

一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行&#xff01; sudo su - 1. CentOS 系统&#xff1a; yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

vulnyx Blogger writeup

信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面&#xff0c;gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress&#xff0c;说明目标所使用的cms是wordpress&#xff0c;访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...

Razor编程中@Html的方法使用大全

文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...