当前位置:小鱼儿玄机二站 > 编程应用 > 使用Python写个小监控

使用Python写个小监控

文章作者:编程应用 上传时间:2019-09-03

使用Python写个小监察和控制,使用Python写监察和控制

1.入门

先是你得用过C/C++、java、Javascript等的一种,编程小白测度比较坚苦,有自然编制程序经验的python小白相对轻巧些。

1.1 Hello World!

Python安装相比轻易,到官英特网下载安装包,一路下一步就足以了。因为自个儿的服务器上安装的是2.6.6,所以笔者也下了那个版本。话说2.x的差异不是不小,假如想用3.x,也许上边包车型客车代码直接运转然而,然而也好些个,稍微改改就能够。
新建一个文本,命名叫hello.py。使用python的IDLE展开hello.py,写入以下代码:

print "Hello World!"

按F5,就足以看见输出结果了。

1.2 基本语法

每一行是一条语句。C语言是透过分行”;“;
因此缩进来组织代码块。C语言是经过大括号”{}“;
申明使用井号”#“。

1.3 数据类型、运算符、数据结构

运算符和C语言大致,C语言有的基本上直接用就可以。
数据类型有数值型,字符串。数据结构有 list, tuple, dict, set。介绍一下tuple, 不能够修改,通过索引实行搜寻。dict类似于map,寄存键值对。来看例子,看看tuple使用:

>>> t=(1,2,[1,2])
>>> t[2]
[1, 2]

1.4 流程序调控制

Python中得以应用if elif else、for和 while 来落到实处流程序调整制。一样有 break 和 continue。有少数和C分裂,借使有一个支行什么都不做,要利用 pass。举个例子

list=[0, 1, 2, 3, 4, 5]
for item in list:
  if item == 1:
    print item
  elif item in (2, 3, 4, 5):
    print "aha " + str(item)
  else:
    pass

运维结果是:
1
aha 2
aha 3
aha 4
aha 5

1.5 模块组织

有一点点子和类。

措施这么定义

def func(var):
   some code here

类和C++等有个别不一样

class MyClass(object):
  common = 1
  def __init__(self):
    self.myvariable = 5
  def myfunction(self, arg1, arg2):
    return self.myvariable

common变量也就是C++中用 static 修饰的变量,全体类通用;承接也非常轻松,能够看看开端引入的那篇小说。

1.6 格外管理

不行管理特别轻松,直接贴代码了:

def some_function():
  try:
    # Division by zero raises an exception
    10 / 0
  except ZeroDivisionError:
    print "Oops, invalid."
  else:
    # Exception didn't occur, we're good.
    pass
  finally:
    # This is executed after the code block is run
    # and all exceptions have been handled, even
    # if a new exception is raised while handling.
    print "We're done with that."

1.7 工程集团

直接引用库,恐怕从库中引进某二个艺术或变量。

import random
from time import clock

2. 数据库查询

既是是督查,免不了和数据库打交道。笔者动用的是PostgreSQL,所以就介绍一下python怎么调用postgres。

连年postgres首先要设置二个库psycopg2,Windows下直接下载安装即可,注意选对版本。作者的服务器是CentOS,安装直接运转

yum install python-psycopg2

就OK了。

2.1 首先成立数据库连接

#get database connect
def get_con():  
  host = '127.0.0.1'
  port = "5432"
  database = 'platform'
  user = 'postgres'
  password = 'postgres'
  conn = psycopg2.connect(database=database, user=user, password=password, host=host, port=port)
  return conn

2.2 执行SQL语句

#执行sql查询
def query(conn, sql):
  cursor = conn.cursor()
  cursor.execute(sql)
  results = cursor.fetchall()
  #close cursor
  cursor.close()
  return results

2.3 然后就足以写实际专门的学问了

def getUsers():
  conn = get_con()#open connect
  sql = """select *
     from t_user
     order by intime DESC
     limit 5"""
  items = query(conn , sql)
  print str(items)
  conn.close() #close connect

注意3个引号”””,正是惯常字符串,可是能够换行。

3. 出殡和埋葬邮件

查询到数码未来无法霎时通报管理员的话监察和控制就没风趣了。所以大家通过邮件来通告,直接运用python的正规化库 smtplib 就能够了。写个发送邮件的函数:

#发送邮件
def send_email(subject, content):
  sender = "[email protected]***.com"
  password = "******" #密码是看不见的哦
  receivers = [tq8117179#163.com] #本人真实邮箱,欢迎发邮件讨论技术问题
  host = "smtp.exmail.qq.com"
  port = 465
  msg = MIMEText(content,'html','utf-8')
  msg['From'] = sender
  msg['To'] = ",".join(receivers)
  msg['Subject'] = Header(subject, 'utf-8')
  try:
    smtp = smtplib.SMTP_SSL(host, port)
    smtp.login(sender, password)
    smtp.sendmail(sender, receivers, msg.as_string())
  except Exception, e:
    logger.error(e)
  logger.info(content)

4.日志

发送邮件时大家使用了logger,那些logger是怎么来的啊?新建贰个log.py,代码如下

# coding=utf-8
import logging
import logging.handlers
logger = logging.getLogger('monitor')
logger.setLevel(logging.DEBUG)
filehandler = logging.handlers.TimedRotatingFileHandler( 
    "/mnt/log/monitor/monitor_log", 'midnight', 1, 7)
# 设置文件后缀名称
filehandler.suffix = "%Y%m%d.log"
formatter = logging.Formatter('%(asctime)s-%(name)s-%(levelname)s: %(message)s')
filehandler.setFormatter(formatter)
logger.addHandler(filehandler)
通过logging.getLogger(‘monitor')生成一个logger,然后配置一个文件处理器。
然后在我们监控程序中引用即可:

from log import logger

5. 把可配置音讯放到配置文件中

假若大家抬高一个管理员如何是好?假使大家的信箱密码变了如何是好?直接更动python文件啊,哈哈。python不用编写翻译直接改代码就好了,不过大家的前后相继之后要卷入呢,所以最佳写个布局文件,python的布局文件读取特别简单,使用python库 ConfigParser 就能够:

config = None
#get config
def getConfig():
  global config
  if config is None:
    config = ConfigParser.ConfigParser()
    config.read("monitor.ini")
  return config

然后那样使用:

#get database connect
def get_con():  
  host = getConfig().get('db', 'host')
  port = getConfig().get('db', 'port')
  database = getConfig().get('db', 'database')
  user = getConfig().get('db', 'user')
  password = getConfig().get('db', 'password')
  conn = psycopg2.connect(database=database, user=user, password=password, host=host, port=port)
  return conn
#发送邮件
def send_email(subject, content):
  sender = getConfig().get('mail', 'sender')
  password = getConfig().get('mail', 'password')
  receivers = getConfig().get('mail', 'receivers').split(",")
  host = getConfig().get('mail', 'host')
  port = getConfig().getint('mail', 'port')
  msg = MIMEText(content,'html','utf-8')
  msg['From'] = sender
  msg['To'] = ",".join(receivers)
  msg['Subject'] = Header(subject, 'utf-8')
  try:
    smtp = smtplib.SMTP_SSL(host, port)
    smtp.login(sender, password)
    smtp.sendmail(sender, receivers, msg.as_string())
  except:
    logger.exception("Exception: ")
  logger.info(content)

安顿文件是monitor.ini,内容如下:

#数据库配置
[db]
host = 127.0.0.1
port = 5432
database = platform
user = postgres
password = postgres
#邮件配置
[mail]
sender = [email protected]
password = ******
#多个联系人用英文逗号隔开
receivers = tq8117179#163.com
host = smtp.exmail.qq.com
port = 465

6. 加点调控

咱俩每5分钟查一下多少,不过职业sql只好查询前段时间的几条,所以要加个时间段限制,弄个初叶、甘休时间。

start_time = "2015-10-1 16:24:24"
end_time = None
#update end_time, invoke before get new data
def update_end_time():
  global end_time
  now = time.mktime(datetime.now().timetuple())
  end_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(now))
  return end_time
#update end_time, invoke after get new data
def update_start_time():
  global start_time
  global end_time
  start_time = end_time
  return start_time
getUsers可以改写成:

def getUsers (conn):
  global start_time
  global end_time
  sql = """select *
     from t_user
     where intime>=""" +"'"+start_time+"' and intime<"+"'"+end_time+"';"
  items = query(conn, sql)
  if items is not None and len(items)>0:
    count = len(items)
    tip = "又有"+str(count)+"个用户已经注册了。"+end_time
    send_email(tip, tip+"n"+str(items))

下一场写个联合的调整:

def task():
  #init end_time and start_time, must init end_time first!!!
  end_time = update_end_time()
  start_time = update_start_time()
  #init config
  getConfig()
  while True:
    conn = get_con()   #open connect
    end_time = update_end_time()
    ############## process ##############
    logger.info("query: "+end_time)
    getUsers (conn)
    #do some task else here
    ## end
    update_start_time()
    conn.close()#close connect
    time.sleep(5*60)
  #end of while
def run_monitor():
  monitor = threading.Thread(target=task)
  monitor.start()
if __name__ == "__main__":
  run_monitor()

在task这么些函数的while中,首先更新end_time,也正是眼前岁月;实施完再把start_time更新成刚刚的end_time,那样就不会有漏网之鱼了。还只怕有一个内需注意的地点,关键字global。 在python中,使用全局变量是需求global关键字张开宣示的,不然会出标题。

7. 运行

展开linux 调节台,直接运维python monitor.py是足以运作的,但是shell一旦退出,任务也就停下了。于是本人就采取了三个进度管理工科具:Supervisor。Supervisor 在进度中断时还可以自行重启。

7.1. 安装supervisor

率先安装python-setuptools

yum install python-setuptools

安装supervisor

 easy_install supervisor

生成supervisor配置文件

 echo_supervisord_conf > /etc/supervisord.conf

然后在/etc/supervisord.conf添加:

[program:monitor]
command = python /usr/monitor/monitor.py
directory = /usr/monitor
user = root

7.2. 周转监察和控制

然后在极端中运维supervisord运维supervisor。
在顶峰中运作supervisorctl,步向shell,运维status查看脚本的运作情状。

7.3. 关门监察和控制 以及常用命令

以下命令全体在supervisorctl的shell中进行。

  • shutdown 截止Supervisor(子进度也会被终止) ;
  • start monitor 开启monitor进程服务(一旦monitor进度退出,会自运转) ;
  • stop monitor 关闭monitor进度服务 ;
  • restart monitor 关闭正在运维的monitor进程,并且重新起动monitor进度服务 ;
  • reload 重新加载supervisor配置文件 ;
  • exit 退出supervisorctl的shell。

前后相继基本上就写完了,也能够跑起来了,是或不是很酷,我们快点动手实施一下啊!

目前使用python写了个小监察和控制,为啥使用python?轻松、方便、好管理。

您也许感兴趣的篇章:

  • 写了个监督nginx进程的Python脚本
  • python动态监督日志内容的身体力行
  • python操作摄像头截图实现长途监察和控制的事例
  • python完结监督windows服务并活动运营服务示范
  • python监控网卡流量并采取graphite绘图的示范
  • 使用Python的Supervisor举办进度监察和控制以及机关运营
  • python实现监察和控制linux质量及进程消耗质量的格局
  • Python写的劳动监察和控制程序实例
  • Python脚本实现网卡流量监察和控制
  • Python中选择Inotify监察和控制文件实例

1.入门 首先你得用过C/C++、java、Javascript等的一种,编制程序小白估算相比较不方便,有早晚编制程序经验的pyth...

率先本人也是个python小白,就现学现用了。

1.入门

首先你得用过C/C++、java、Javascript等的一种,编制程序小白估摸比较不方便,有必然编制程序经验的python小白相对轻松些。小编是参照的那篇文章 Learn Python in 10 minutes,写的非常不错,可是本身看完用了30秒钟,哈哈。

1.1 Hello World!

Python安装比较简单,到官英特网下载安装包,一路下一步就能够了。因为本人的服务器上安装的是2.6.6,所以本人也下了这一个本子。话说2.x的差距不是十分的大,假如想用3.x,恐怕上边包车型地铁代码直接运转然而,然则也大半,稍微改改就可以。

新建二个文件,命名称叫hello.py。使用python的IDLE张开hello.py,写入以下代码:

print "Hello World!"

按F5,就能够望见输出结果了。

1.2 基本语法

每一行是一条语句。C语言是因此分行”;“;

通过缩进来协会代码块。C语言是经过大括号”{}“;

申明使用井号”#“。

1.3 数据类型、运算符、数据结构

运算符和C语言几乎,C语言有的基本上直接用就足以。

数据类型有数值型,字符串。数据结构有 list, tuple, dict, set。介绍一下tuple, 不能够修改,通过索引实行搜寻。dict类似于map,贮存键值对。来看例子,看看tuple使用:

>>> t=(1,2,[1,2])

>>> t[2]

[1, 2]

1.4 流程序调节制

Python中得以利用if elif else、for和 while 来完毕流程序调控制。同样有 break 和 continue。有好几和C不一致,即便有三个分段什么都不做,要利用 pass。譬喻

list=[0, 1, 2, 3, 4, 5]

for item in list:

if item == 1:

print item

elif item in (2, 3, 4, 5):

print "aha " + str(item)

else:

pass

运维结果是:

1

aha 2

aha 3

aha 4

aha 5

1.5 模块组织

有措施和类。

艺术这么定义

def func(var):

some code here

类和C++等有些分歧

class MyClass(object):

common = 1

def __init__(self):

self.myvariable = 5

def myfunction(self, arg1, arg2):

return self.myvariable

common变量相当于C++中用 static 修饰的变量,全数类通用;承继也非常轻松,能够看看起先引入的那篇小说。

1.6 格外管理

特别管理特别轻巧,直接贴代码了:

def some_function():

try:

# Division by zero raises an exception

10 / 0

except ZeroDivisionError:

print "Oops, invalid."

else:

# Exception didn't occur, we're good.

pass

finally:

# This is executed after the code block is run

# and all exceptions have been handled, even

# if a new exception is raised while handling.

print "We're done with that."

1.7 工程集团

直接引用库,恐怕从库中引进某三个艺术或变量。

import random

from time import clock

2. 数据库查询

既是是监督检查,免不了和数据库打交道。作者使用的是PostgreSQL,所以就介绍一下python怎么调用postgres。别的数据库类似,自行google就好了。

连天postgres首先要安装一个库psycopg2,Windows下间接下载安装就能够,注意选对版本。作者的服务器是CentOS,安装直接运营

yum install python-psycopg2

就OK了。

2.1 首先创设数据库连接

#get database connect

def get_con():

host = '127.0.0.1'

port = "5432"

database = 'platform'

user = 'postgres'

password = 'postgres'

conn = psycopg2.connect(database=database, user=user, password=password, host=host, port=port)

return conn

2.2 执行SQL语句

#执行sql查询

def query(conn, sql):

cursor = conn.cursor()

cursor.execute(sql)

results = cursor.fetchall()

#close cursor

cursor.close()

return results

2.3 然后就足以写现实事务了

def getUsers():

conn = get_con()#open connect

sql = """select *

from t_user

order by intime DESC

limit 5"""

items = query(conn , sql)

print str(items)

conn.close()  #close connect

留心3个引号""",正是平凡字符串,但是能够换行。

3. 发送邮件

询问到多少今后无法马上公告管理员的话监察和控制就不曾意义了。所以大家经过邮件来打招呼,直接行使python的标准库 smtplib 就足以了。写个发送邮件的函数:

#发送邮件

def send_email(subject, content):

sender = "yourmail@***.com"

password = "******" #密码是看不见的哦

receivers = [tq8117179#163.com] #本人真实邮箱,欢迎发邮件讨论技术问题

host = "smtp.exmail.qq.com"

port = 465

msg = MIMEText(content,'html','utf-8')

msg['From'] = sender

msg['To'] = ",".join(receivers)

msg['Subject'] = Header(subject, 'utf-8')

try:

smtp = smtplib.SMTP_SSL(host, port)

smtp.login(sender, password)

smtp.sendmail(sender, receivers, msg.as_string())

except Exception, e:

logger.error(e)

logger.info(content)

4.日志

出殡邮件时大家应用了logger,那些logger是怎么来的吗?新建三个log.py,代码如下

# coding=utf-8

import logging

import logging.handlers

logger = logging.getLogger('monitor')

logger.setLevel(logging.DEBUG)

filehandler = logging.handlers.TimedRotatingFileHandler(

"/mnt/log/monitor/monitor_log", 'midnight', 1, 7)

# 设置文件后缀名称

filehandler.suffix = "%Y%m%d.log"

formatter = logging.Formatter('%(asctime)s-%(name)s-%(levelname)s: %(message)s')

filehandler.setFormatter(formatter)

logger.addHandler(filehandler)

透过logging.getLogger('monitor')生成贰个logger,然后配置一个文书处理器。

然后在大家监察和控制程序中引用就能够:

from log import logger

5. 把可配置音信放到配置文件中

若果大家增加三个大班如何是好?假设大家的信箱密码变了咋办?直接修改python文件啊,哈哈。python不用编写翻译直接改代码就好了,不过我们的主次之后要卷入呢,所以最棒写个布局文件,python的布署文件读取非常简单,使用python库 ConfigParser 就能够:

config = None

#get config

def getConfig():

global config

if config is None:

config = ConfigParser.ConfigParser()

config.read("monitor.ini")

return config

然后这样使用:

#get database connect

def get_con():

host = getConfig().get('db', 'host')

port = getConfig().get('db', 'port')

database = getConfig().get('db', 'database')

user = getConfig().get('db', 'user')

password = getConfig().get('db', 'password')

conn = psycopg2.connect(database=database, user=user, password=password, host=host, port=port)

return conn

#发送邮件

def send_email(subject, content):

sender = getConfig().get('mail', 'sender')

password = getConfig().get('mail', 'password')

receivers = getConfig().get('mail', 'receivers').split(",")

host = getConfig().get('mail', 'host')

port = getConfig().getint('mail', 'port')

msg = MIMEText(content,'html','utf-8')

msg['From'] = sender

msg['To'] = ",".join(receivers)

msg['Subject'] = Header(subject, 'utf-8')

try:

smtp = smtplib.SMTP_SSL(host, port)

smtp.login(sender, password)

smtp.sendmail(sender, receivers, msg.as_string())

except:

logger.exception("Exception: ")

logger.info(content)

布署文件是monitor.ini,内容如下:

#数据库配置

[db]

host = 127.0.0.1

port = 5432

database = platform

user = postgres

password = postgres

#邮件配置

[mail]

sender = yourmail@XXX.com

password = ******

#多个联系人用英文逗号隔开

receivers = tq8117179#163.com

host = smtp.exmail.qq.com

port = 465

6. 加点调整

咱俩每5秒钟查一下多少,然则专门的学问sql只能查询近来的几条,所以要加个时间段限制,弄个初叶、甘休时间。

start_time = "2015-10-1 16:24:24"

end_time = None

#update end_time, invoke before get new data

def update_end_time():

global end_time

now = time.mktime(datetime.now().timetuple())

end_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(now))

return end_time

#update end_time, invoke after get new data

def update_start_time():

global start_time

global end_time

start_time = end_time

return start_time

getUsers可以改写成:

def getUsers (conn):

global start_time

global end_time

sql = """select *

from t_user

where  intime>=""" +"'"+start_time+"' and intime<"+"'"+end_time+"';"

items = query(conn, sql)

if items is not None and len(items)>0:

count = len(items)

tip = "又有"+str(count)+"个用户已经注册了。"+end_time

send_email(tip, tip+"n"+str(items))

接下来写个联合的调节:

def task():

#init end_time and start_time, must init end_time first!!!

end_time = update_end_time()

start_time = update_start_time()

#init config

getConfig()

while True:

conn = get_con()    #open connect

end_time = update_end_time()

############## process ##############

logger.info("query: "+end_time)

getUsers (conn)

#do some task else here

## end

update_start_time()

conn.close()#close connect

time.sleep(5*60)

#end of while

def run_monitor():

monitor = threading.Thread(target=task)

monitor.start()

if __name__ == "__main__":

run_monitor()

在task那一个函数的while中,首先更新end_time,也正是时下光阴;推行完再把start_time更新成刚刚的end_time,那样就不会有漏网之鱼了。还大概有五个急需专一的地方,关键字global。 在python中,使用全局变量是索要global关键字展开宣示的,不然会出难点。

7. 运行

开拓linux 调整台,直接运营python monitor.py是能够运作的,可是shell一旦退出,职务也就终止了。于是小编就挑选了三个经过管理工科具:Supervisor。Supervisor 在经过中断时还能够自动重启。

7.1. 安装supervisor

首先安装python-setuptools

yum install python-setuptools

安装supervisor

easy_install supervisor

生成supervisor配置文件

echo_supervisord_conf > /etc/supervisord.conf

然后在/etc/supervisord.conf添加:

[program:monitor]

command = python /usr/monitor/monitor.py

directory = /usr/monitor

user = root

7.2. 周转监察和控制

然后在终端中运作supervisord启动supervisor。

在极限中运作supervisorctl,进入shell,运行status翻开脚本的运作情况。

7.3. 关门监察和控制 以及常用命令

以下命令全体在supervisorctl的shell中实行。

shutdown 停止Supervisor(子进度也会被截止) ;

start monitor 开启monitor进度服务(一旦monitor进程退出,会自运行) ;

stop monitor 关闭monitor进度服务 ;

restart monitor 关闭正在周转的monitor进度,而且重新起动monitor进程服务 ;

reload 重新加载supervisor配置文件 ;

exit 退出supervisorctl的shell。

前后相继基本上就写完了,也得以跑起来了。中间借鉴过相当多互联网上的博客,然而记不住了,在那多谢博主们。希望自身的那篇文者可以帮到读友们,也应接大家给笔者发邮件探讨。在那之中比比较多罗马尼亚(România)语注释依旧很稀松的,哈哈,写代码不时比较懒,不想切换中文输入法了,我们凑合着看吗。

本文由小鱼儿玄机二站发布于编程应用,转载请注明出处:使用Python写个小监控

关键词: