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.sh2、返回命令ls -ld file执行结果
>>> status=commands.getstatus('test.sh')
>>> print status
-rw-r--r-- 1 root root 2608 Mar 28 09:56 test.sh3、判断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"}]},
神回复
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。