晓夏

YoungCheung

Zhang Sir's technical way

python 检查linux运行服务

浏览量:1126

一、背景

        最近有一项任务,统计服务器的服务,最为一个攻城狮来讲,这是工作中的常事,也是必须去做的,也是为了尽快熟悉业务,但是问题来了,一台一台的去统计这可难倒我了,能不能我脚本解决呢?shell?Python?既然学习了python何不用python直接搞定呢,于是我就想尝试用Python,我尝试了Python3没搞定发现python2里面有个commands模块,于是就这样开始了。。。。。。

         在开始之向大家介绍一个模块,commands模块,commands模块是Python的内置模块,他共有三个函数,使用help(commands)可以查看到。

Help on module commands:

NAME
    commands - Execute shell commands via os.popen() and return status, output.

FILE
    /usr/lib64/python2.7/commands.py

DESCRIPTION
    Interface summary:
    
           import commands
    
           outtext = commands.getoutput(cmd)
           (exitstatus, outtext) = commands.getstatusoutput(cmd)
           outtext = commands.getstatus(file)  # returns output of "ls -ld file"
    
    A trailing newline is removed from the output string.
    
    Encapsulates the basic operation:
    
          pipe = os.popen('{ ' + cmd + '; } 2>&1', 'r')
          text = pipe.read()
          sts = pipe.close()
    
     [Note:  it would be nice to add functions to interpret the exit status.]

FUNCTIONS
    getoutput(cmd)
        Return output (stdout or stderr) of executing cmd in a shell.
    
    getstatus(file)
        Return output of "ls -ld <file>" in a string.
    
    getstatusoutput(cmd)
        Return (status, output) of executing cmd in a shell.

DATA
    __all__ = ['getstatusoutput', 'getoutput', 'getstatus']

1、 commands.getstatusoutput(cmd)返回一个元组(status,output) ,status代表的shell命令的返回状态,如果成功的话是0;output是shell的返回的结果

[root@YoungCheung test]# python
Python 2.7.5 (default, Sep 15 2016, 22:37:39) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import commands
>>> help(commands)

>>> import commands
>>> status,output = commands.getstatusoutput("ls")
>>> print status
0
>>> print output
a.py
hello_world.go
test.py
test.sh

2、返回命令ls -ld file执行结果

>>> status=commands.getstatus('test.sh')
>>> print status
-rw-r--r-- 1 root root 2608 Mar 28 09:56 test.sh

3、判断shell命令输出内容

>>> print commands.getoutput("ls")
a.py
hello_world.go
test.py
test.sh

接下来我们回到最开始的问题上,如何使用python并且用这个命令输出运行服务的name && port 

二、code

[root@YoungCheung test]# cat check_service.py 
#!/usr/bin/python
# coding=utf-8
import commands


##########返回命令执行结果
def getComStr(comand):
    try:
        stat, proStr = commands.getstatusoutput(comand)
    except:
        print
        "command %s execute failed, exit" % comand
    # 将字符串转化成列表
    # proList = proStr.split("\n")
    return proStr


##########获取系统服务名称和监听端口
def filterList():
    tmpStr = getComStr("sudo netstat -tpln")
    tmpList = tmpStr.split("\n")
    del tmpList[0:2]
    newList = []
    for i in tmpList:
        val = i.split()
        del val[0:3]
        del val[1:3]
        # 提取端口号
        valTmp = val[0].split(":")
        val[0] = valTmp[-1]
        # 提取服务名称
        valTmp = val[1].split("/")
        val[1] = valTmp[-1]
        if val[1] != '-' and val not in newList:
            newList.append(val)
    return newList


def main():
    netInfo = filterList()
    # 格式化成适合zabbix lld的json数据
    json_data = "{\n" + "\t" + '"data":[' + "\n"
    # print netInfo
    for net in netInfo:
        if net != netInfo[-1]:
            json_data = json_data + "\t\t" + "{" + "\n" + "\t\t\t" + '"{#PPORT}":"' + str(
                net[0]) + "\",\n" + "\t\t\t" + '"{#PNAME}":"' + str(net[1]) + "\"},\n"
        else:
            json_data = json_data + "\t\t" + "{" + "\n" + "\t\t\t" + '"{#PPORT}":"' + str(
                net[0]) + "\",\n" + "\t\t\t" + '"{#PNAME}":"' + str(net[1]) + "\"}]}"
    print json_data


if __name__ == "__main__":
    main()

输出结果:

[root@YoungCheung test]# python check_service.py 
{
	"data":[
		{
			"{#PPORT}":"3690",
			"{#PNAME}":"svnserve"},
		{
			"{#PPORT}":"139",
			"{#PNAME}":"smbd"},
		{
			"{#PPORT}":"80",
			"{#PNAME}":"nginx:"},
		{
			"{#PPORT}":"81",
			"{#PNAME}":"httpd"},
		{
			"{#PPORT}":"210",
			"{#PNAME}":"sshd"},
		{
			"{#PPORT}":"443",
			"{#PNAME}":"nginx:"},
		{
			"{#PPORT}":"445",
			"{#PNAME}":"smbd"},
		{
			"{#PPORT}":"10050",
			"{#PNAME}":"zabbix_agentd"},
		{
			"{#PPORT}":"10051",
			"{#PNAME}":"zabbix_server"},
		{
			"{#PPORT}":"9000",
			"{#PNAME}":"php-fpm:"},
		{
			"{#PPORT}":"3306",
			"{#PNAME}":"mysqld"}]},

Anyway,It's dogged that does it



神回复

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。