使用Python监控服务器在线状态

前言

在公司内网有一台服务器,有动态的公网IP,使用DDNS对外提供服务,但是会因为停电、服务器卡死等原因导致服务器离线。服务器离线后无法及时获知,因此需要实现在服务器离线的时候能够发送消息到手机上。

思路梳理

公司办理的是联通的商务宽带,有赠送一台沃云的ECS,但是一直处于闲置状态,于是就想利用这个ECS去监听服务器的端口,一旦端口无法访问,就发送消息到手机上,端口恢复访问也可以发送消息到手机上。

具体实施

内网服务器配置

开放监听的端口

在内网服务器上开放一个端口,用于给公网上的ECS监听。

bash 复制代码
[root@rsecc ~]# yum -y install  nc
[root@rsecc ~]# nc -lk 32768 &
chkconfig管理

因为nc命令会在服务器重启后退出,因此可以使用chkconfig将nc服务设置为开机自启。

bash 复制代码
[root@rsecc ~]# vim /etc/init.d/ncserver

写入如下内容:

bash 复制代码
#!/bin/bash
# chkconfig: 3 88 88
/usr/bin/nc -lk 32768 &

配置权限,并添加到开机自启。

bash 复制代码
[root@rsecc ~]# chmod +x /etc/init.d/ncserver
[root@rsecc ~]# chkconfig --add ncserver
[root@rsecc ~]# chkconfig --list ncserver
ncserver          0:off	1:off	2:off	3:on	4:off	5:off	6:off

这样的话,当服务器重启后,nc命令也会随着服务器启动。

防火墙配置

还需要在防火墙上放行对应的端口。

bash 复制代码
[root@rsecc ~]# firewall-cmd --add-port=32768/tcp
[root@rsecc ~]# firewall-cmd --reload

公网ECS配置

编写python脚本

编写python脚本来实现功能,并将python脚本设置为开机自启。

导入需要使用的模块,这里使用了 socket、time、json、requests 四个模块。

python 复制代码
import socket
import time
import requests
import json

编写发送消息的函数模块,我这里使用的是企业微信的webhook机器人,也可以使用钉钉、邮箱、短信等方式发送消息。

python 复制代码
webhook = "webhook地址链接"

#webhook发送消息
def send_text(webhook, content):
    header = {
                "Content-Type": "application/json",
                "Charset": "UTF-8"
                }
    data ={
        "msgtype": "text",
        "text": {
            "content": content
        }
    }
    data = json.dumps(data)
    info = requests.post(url=webhook, data=data, headers=header)

编写判断服务器状态的函数模块。这里使用的Python中的Socket标准库,通过构建一个TCP连接的Socket对象,使用connect_ex()方法连接服务器,如果连接无异常返回的状态码为0。通过判读返回的状态码是否为0来判断服务器是否在线。

python 复制代码
def check_server_connection(server, port):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    result = sock.connect_ex((server, port))
    if result == 0:
        service_status = "on"
        return service_status
    else:
        service_status = "off"
        return service_status

编写一个while死循环,通过判断状态码是否发生改变,来实现发送消息的效果。

bash 复制代码
service_status = "off"
prev_service_status = "off"

while True:
    service_status = check_server_connection("服务器地址", 32768)
    if prev_service_status != service_status:
        if service_status == "off":
            content = "服务器已离线!"
            send_text(webhook, content)
        else:
            content = "服务器已上线!"
            send_text(webhook, content)
        prev_service_status = service_status
    time.sleep(60)
设置为开机自启。

实现方式和内网服务器一样,使用ckhconfig命令。

bash 复制代码
[root@rsecc ~]# vim /etc/init.d/ncserver

写入如下内容:

bash 复制代码
#!/bin/bash
# chkconfig: 3 88 88
/usr/bin/python3 /opt/serveron.py &

配置权限,并添加到开机自启。

bash 复制代码
[root@rsecc ~]# chmod +x /etc/init.d/ncserver
[root@rsecc ~]# chkconfig --add ncserver
[root@rsecc ~]# chkconfig --list ncserver
ncserver          0:off	1:off	2:off	3:on	4:off	5:off	6:off

这样的话,当服务器重启后,python脚本也会随着服务器启动。

效果

总结

至此,通过一个简易的脚本即可实现服务器的状态监控。

© 版权声明

文章:使用Python监控服务器在线状态

作者:Guangran

链接:https://www.rsecc.cn/955.html

声明:如无特别说明本文即为原创文章仅代表个人观点,版权归《广然笔记》所有,未经授权、请勿转载。

相关推荐
阿巴~阿巴~1 天前
死锁防范:四大条件与破解之道
linux·服务器·线程·线程安全·死锁
王道长服务器 | 亚马逊云1 天前
AWS + 飞天CMS:高性能内容站的云端搭建方案
服务器·搜索引擎·aws
云资源服务商1 天前
深度解析阿里云通用算力型U1与U2i实例性能差异:架构、算力、场景选型全对比
服务器·阿里云·云计算
永远有缘1 天前
Java、Python、C# 和 C++ 在函数定义语法上的主要区别
java·c++·python·c#
阿巴~阿巴~1 天前
Linux同步机制:POSIX 信号量 与 SystemV信号量 的 对比
linux·服务器·线程·信号量·线程同步·posix·system v
fyakm1 天前
Linux文件搜索:grep、find命令实战应用(附案例)
linux·运维·服务器
wanhengidc1 天前
云手机存在的意义是什么
运维·服务器·arm开发·安全·智能手机
007php0071 天前
某游戏大厂 Java 面试题深度解析(四)
java·开发语言·python·面试·职场和发展·golang·php
景彡先生1 天前
Python pandas数据透视表(pivot_table)详解:从入门到实战,多维数据分析利器
python·数据分析·pandas
Blossom.1181 天前
把AI“编”进草垫:1KB决策树让宠物垫自己报「如厕记录」
java·人工智能·python·算法·决策树·机器学习·宠物