用Python写Linux脚本实例(二)

kafka报警脚本

写在前面的话

本人萌新,发文章一是为了记录自己写的东西,二是为了学习,同时希望能够帮助别人。语法什么的自己觉得也很low,大佬们不喜勿喷。

遇到的问题

1.python如何获取shell命令返回的结果

之前提到过os.system可以直接执行shell命令,但是无法获取到结果。

方法一
result = os.popen('ps -aux')  
      res = result.read()  
      for line in res.splitlines():  
              print line

使用os.popen可以获取到结果,我使用的是这种方法。

方法二

使用commands,不过这种方法在python3中被舍弃了,使用subprocess替代

import commands

result = commands.getoutput('cmd')   #只返回执行的结果, 忽略返回值.
result = commands.getstatus('cmd')   #返回ls -ld file执行的结果.
result = commands.getstatusoutput('cmd') 
#用os.popen()执行命令cmd, 然后返回两个元素的元组(status, result). cmd执行的方式是{ cmd ; }2>&1, 这样返回结果里面就会包含标准输出和标准错误.
方法三

使用内置模块subprocess
详细的解释点这里

# /usr/bin/python
# -*- coding: UTF-8 -*-
import subprocess

group_list = subprocess.Popen("ip a", shell=True)
print(group_list.stdout.read())

用Python写Linux脚本实例(二)_第1张图片
在使用subprocess.run和subprocess.call的时候提示我这个模块没有这个元素。。。求大佬帮助
用Python写Linux脚本实例(二)_第2张图片

2.python怎么进行队列相加(没解决)求大佬帮助

考虑到了分片,要将所有的加在一起。shell的返回结果是这样的,我需要将第六列相加。由于不会(尴尬,不会你写什么文章)。我直接使用shell的awk获取的最后的值。求大佬指点。。。怎么用python写。

awk '{#print$6}' | awk '{number+=$1}END{#print number}'

在这里插入图片描述

3.拼接字符串

累死了,自己试吧(嘿嘿)

最终脚本

# /usr/bin/python
# -*- coding: UTF-8 -*-
import os

CURL_ADDRESS = 'https://qyapi.weixin.qq.com/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
THRESHOLD = 100
list_1 = []
list_2 = []

def main():
    res = result()
    get_result_number(res)
    
def result():
    result = os.popen("/opt/kafka/default/bin/kafka-consumer-groups-scram.sh --list --bootstrap-server a02.firedata.hadoop.datanode:9092 --command-config /opt/kafka/default/config/consumer-scram.properties | grep -v '^anonymous'")
    res = result.read()
    return res

def get_group_number(number):
    group_number = os.popen(
        "/opt/kafka/default/bin/kafka-consumer-groups-scram.sh  --describe --bootstrap-server a02.firedata.hadoop.datanode:9092 --group" + " " + number + " " + "--command-config /opt/kafka/default/config/consumer-scram.properties | awk '{#print$6}' | awk '{number+=$1}END{#print number}'")
    return group_number

def get_markdown_content_1(number_1):
    markdown_content_1 = ">服务名称:""" + str(number_1) + "\\n>未处理消息数:" + str(x) + "\\n"
    return markdown_content_1

def curl_(markdown_content):
    os.system("curl" " " + CURL_ADDRESS + " ""-H 'Content-Type: application/json' -d '{\"msgtype\": \"markdown\",\"markdown\": {\"content\": \"kafka未处理队列超出预定值,请注意。\n" + markdown_content + "\"'")

def get_result_number(res):
    markdown_content = ''
    for i in res.splitlines():
        list_1.append(i)
    j = len(list_1)

    for k in range(0, j):
        number = list_1[k]
        group_number = get_group_number(number)
        group_number_all = group_number.read()

        for x in group_number_all.splitlines():
            x = int(x)

        if x >= threshold:
            list_2.append(x)
            number_1 = list_1[k]
            markdown_content_1 = get_markdown_content_1(number_1)
            markdown_content = str(markdown_content) + str(markdown_content_1)

        if len(list_2) > 9:
            curl_(markdown_content)
            markdown_content = ''
            list_2 = []
    if len(list_2) > 0:
        curl_(markdown_content)

if __name__ == '__main__':
    main()

脚本实现效果

用Python写Linux脚本实例(二)_第3张图片

你可能感兴趣的:(Python)