Python 监控服务器 cpu 及报警,手动执行没有问题,但是后台启动就会有问题,不会发送报警。不知道是什么原因,请大佬给点建议 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
longmeier90

Python 监控服务器 cpu 及报警,手动执行没有问题,但是后台启动就会有问题,不会发送报警。不知道是什么原因,请大佬给点建议

  •  
  •   longmeier90 Mar 2, 2021 1737 views
    This topic created in 1882 days ago, the information mentioned may be changed or developed.
    import subprocess import re import pika import time, datetime # 定义删除 ANSI escape code ansi_escape = re.compile(r'\x1B[@-_][0-?]*[ -/]*[@-~]') # 消息队列连接 def rabbit_connect(): credentials = pika.PlainCredentials("admin", "bolin1024") cOnnection= pika.BlockingConnection(pika.ConnectionParameters( host="39.96.5.133", port=5672, credentials=credentials)) # 定义连接池 channel = connection.channel() # 声明队列以向其发送消息消息 return channel, connection # 消息队列关闭 def rabbit_close(connection): connection.close() # 消息队列发送消息 def create_msg(channel, msg): """ 消息发送方 :param msg: :return: """ # durable server 挂了 队列仍然存在 channel.queue_declare(queue="cpu_monitor", durable=True) # delivery_mode=2:使消息持久化。和队列名称绑定 routing_key channel.basic_publish(exchange='', routing_key="cpu_monitor", body=msg, properties=pika.BasicProperties(delivery_mode=2)) # 监控程序 def monitor_process(): top_info = subprocess.Popen(["top", "-n", "1"], stdout=subprocess.PIPE) out, err = top_info.communicate() out_info = out.decode('unicode-escape') lines, result = [], [] lines = out_info.split('\n') if len(lines) >= 13: load_average = lines[0] load_aver = load_average.split() loads = [ansi_escape.sub('', col).upper().replace("\x1b(B", '') for col in load_aver] loads = list(filter(None, loads)) loads_cpu0 = float(loads[11].replace(',', '').strip()) if len(loads) > 11 else 4 for l in range(7, 13): hang = str(lines[l]) hangs = hang.split() hangs = [ansi_escape.sub('', col).upper().replace("\x1b(B", '') for col in hangs] hangs = list(filter(None, hangs)) if len(hangs) > 11: pid = hangs[0] user = hangs[1] cpu = hangs[8] mem = hangs[9] apps = hangs[11] if float(cpu) > 80 and 'MYSQL' not in apps and loads_cpu0 > 4: print(pid, user, cpu, mem, apps, loads_cpu0) print('请开始报警....', cpu) spy_info = subprocess.Popen(["py-spy","dump","--pid", pid], stdout=subprocess.PIPE) out2, err2 = spy_info.communicate() out_info2 = out2.decode('unicode-escape') lines2 = [] lines2 = out_info2.split('\n') for l in range(len(lines2)): hang2 = str(lines2[l]) print(hang2) hangs2 = hang2.split("(") if len(hangs2) > 1: meth = hangs2[0].strip() path = hangs2[1].split(")")[0].strip() if meth == "get" and "/views/" in path: meta = {'name': path, 'cpu': cpu, 'loads_cpu0': loads_cpu0} print(meta) result.append(meta) # 如果存在要发送的消息 if len(result) > 0: channel_, connection_ = rabbit_connect() for rt in result: create_msg(channel_, str(meta)) rabbit_close(connection_) if __name__ == "__main__": print('cpu 报警程序已启动....') while True: now_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') print('%s cpu 报警程序 monitor_process...' % now_time) try: monitor_process() except Exception as e: print(e) time.sleep(20) 
    program9527
        1
    program9527  
       Mar 2, 2021
    整个代码中使用了两处 subprocess.Popen,手动启动时,你的终端会加载用户目录下的 .bashrc 文件,也就是环境变量。在后台启动可能不会加载,从而导致一些系统调用无法正确找到命令。例如你上面的一行:

    subprocess.Popen(["py-spy","dump","--pid", pid]

    建议排查下。。。
    program9527
        2
    program9527  
       Mar 2, 2021
    把这种系统调用改成绝对路径试试
    lmaq
        3
    lmaq  
       Mar 2, 2021
    改下管理员密码吧,暴漏了!
    longmeier90
        4
    longmeier90  
    OP
       Mar 2, 2021
    @lmaq 不知道不能删帖,太坑啦。马上就改
    About     Help     Advertise     Blog     API     FAQ     Solana     1089 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 36ms UTC 22:58 PVG 06:58 LAX 15:58 JFK 18:58
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86