- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章使用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,写入以下代码:
1
|
print
"Hello World!"
|
按F5,就可以看见输出结果了.
1.2 基本语法 。
每一行是一条语句。C语言是通过分号”;“; 通过缩进来组织代码块。C语言是通过大括号”{}“; 注释使用井号”#“.
1.3 数据类型、运算符、数据结构 。
运算符和C语言差不多,C语言有的基本上直接用就可以。 数据类型有数值型,字符串。数据结构有 list, tuple, dict, set。介绍一下tuple, 不能修改,通过索引进行查找。dict类似于map,存放键值对。来看例子,看看tuple使用:
1
2
3
|
>>> t
=
(
1
,
2
,[
1
,
2
])
>>> t[
2
]
[
1
,
2
]
|
1.4 流程控制 。
Python中可以使用if elif else、for和 while 来实现流程控制。同样有 break 和 continue。有一点和C不同,如果有一个分支什么都不做,要使用 pass。例如 。
1
2
3
4
5
6
7
8
|
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 模块组织 。
有方法和类.
方法这样定义 。
1
2
|
def
func(var):
some code here
|
类和C++等有些不同 。
1
2
3
4
5
6
|
class
MyClass(
object
):
common
=
1
def
__init__(
self
):
self
.myvariable
=
5
def
myfunction(
self
, arg1, arg2):
return
self
.myvariable
|
common变量相当于C++中用 static 修饰的变量,所有类通用;继承也非常简单,可以看看开始推荐的那篇文章.
1.6 异常处理 。
异常处理非常简单,直接贴代码了:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
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 工程组织 。
直接引用库,或者从库中引入某一个方法或变量.
1
2
|
import
random
from
time
import
clock
|
2. 数据库查询 。
既然是监控,免不了和数据库打交道。我使用的是PostgreSQL,所以就介绍一下python怎么调用postgres.
连接postgres首先要安装一个库psycopg2,Windows下直接下载安装即可,注意选对版本。我的服务器是CentOS,安装直接运行 。
1
|
yum install python
-
psycopg2
|
就OK了.
2.1 首先创建数据库连接 。
1
2
3
4
5
6
7
8
9
|
#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语句 。
1
2
3
4
5
6
7
8
|
#执行sql查询
def
query(conn, sql):
cursor
=
conn.cursor()
cursor.execute(sql)
results
=
cursor.fetchall()
#close cursor
cursor.close()
return
results
|
2.3 然后就可以写具体业务了 。
1
2
3
4
5
6
7
8
9
|
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 就可以了。写个发送邮件的函数:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
#发送邮件
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,代码如下 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
# 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 即可:
1
2
3
4
5
6
7
8
|
config
=
None
#get config
def
getConfig():
global
config
if
config
is
None
:
config
=
ConfigParser.ConfigParser()
config.read(
"monitor.ini"
)
return
config
|
然后这样使用:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
#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,内容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
#数据库配置
[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只能查询最近的几条,所以要加个时间段限制,弄个开始、结束时间.
。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
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))
|
然后写个统一的调度:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
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 。
1
|
yum install python
-
setuptools
|
安装supervisor 。
1
|
easy_install supervisor
|
生成supervisor配置文件 。
1
|
echo_supervisord_conf >
/
etc
/
supervisord.conf
|
然后在/etc/supervisord.conf添加:
1
2
3
4
|
[program:monitor]
command
=
python
/
usr
/
monitor
/
monitor.py
directory
=
/
usr
/
monitor
user
=
root
|
7.2. 运行监控 。
然后在终端中运行supervisord启动supervisor。 在终端中运行supervisorctl,进入shell,运行status查看脚本的运行状态.
7.3. 关闭监控 以及常用命令 。
以下命令全部在supervisorctl的shell中执行.
程序基本上就写完了,也可以跑起来了,是不是很酷,大家快点动手实践一下吧! 。
最后此篇关于使用Python写个小监控的文章就讲到这里了,如果你想了解更多关于使用Python写个小监控的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我在网上搜索但没有找到任何合适的文章解释如何使用 javascript 使用 WCF 服务,尤其是 WebScriptEndpoint。 任何人都可以对此给出任何指导吗? 谢谢 最佳答案 这是一篇关于
我正在编写一个将运行 Linux 命令的 C 程序,例如: cat/etc/passwd | grep 列表 |剪切-c 1-5 我没有任何结果 *这里 parent 等待第一个 child (chi
所以我正在尝试处理文件上传,然后将该文件作为二进制文件存储到数据库中。在我存储它之后,我尝试在给定的 URL 上提供文件。我似乎找不到适合这里的方法。我需要使用数据库,因为我使用 Google 应用引
我正在尝试制作一个宏,将下面的公式添加到单元格中,然后将其拖到整个列中并在 H 列中复制相同的公式 我想在 F 和 H 列中输入公式的数据 Range("F1").formula = "=IF(ISE
问题类似于this one ,但我想使用 OperatorPrecedenceParser 解析带有函数应用程序的表达式在 FParsec . 这是我的 AST: type Expression =
我想通过使用 sequelize 和 node.js 将这个查询更改为代码取决于在哪里 select COUNT(gender) as genderCount from customers where
我正在使用GNU bash,版本5.0.3(1)-发行版(x86_64-pc-linux-gnu),我想知道为什么简单的赋值语句会出现语法错误: #/bin/bash var1=/tmp
这里,为什么我的代码在 IE 中不起作用。我的代码适用于所有浏览器。没有问题。但是当我在 IE 上运行我的项目时,它发现错误。 而且我的 jquery 类和 insertadjacentHTMl 也不
我正在尝试更改标签的innerHTML。我无权访问该表单,因此无法编辑 HTML。标签具有的唯一标识符是“for”属性。 这是输入和标签的结构:
我有一个页面,我可以在其中返回用户帖子,可以使用一些 jquery 代码对这些帖子进行即时评论,在发布新评论后,我在帖子下插入新评论以及删除 按钮。问题是 Delete 按钮在新插入的元素上不起作用,
我有一个大约有 20 列的“管道分隔”文件。我只想使用 sha1sum 散列第一列,它是一个数字,如帐号,并按原样返回其余列。 使用 awk 或 sed 执行此操作的最佳方法是什么? Accounti
我需要将以下内容插入到我的表中...我的用户表有五列 id、用户名、密码、名称、条目。 (我还没有提交任何东西到条目中,我稍后会使用 php 来做)但由于某种原因我不断收到这个错误:#1054 - U
所以我试图有一个输入字段,我可以在其中输入任何字符,但然后将输入的值小写,删除任何非字母数字字符,留下“。”而不是空格。 例如,如果我输入: 地球的 70% 是水,-!*#$^^ & 30% 土地 输
我正在尝试做一些我认为非常简单的事情,但出于某种原因我没有得到想要的结果?我是 javascript 的新手,但对 java 有经验,所以我相信我没有使用某种正确的规则。 这是一个获取输入值、检查选择
我想使用 angularjs 从 mysql 数据库加载数据。 这就是应用程序的工作原理;用户登录,他们的用户名存储在 cookie 中。该用户名显示在主页上 我想获取这个值并通过 angularjs
我正在使用 autoLayout,我想在 UITableViewCell 上放置一个 UIlabel,它应该始终位于单元格的右侧和右侧的中心。 这就是我想要实现的目标 所以在这里你可以看到我正在谈论的
我需要与 MySql 等效的 elasticsearch 查询。我的 sql 查询: SELECT DISTINCT t.product_id AS id FROM tbl_sup_price t
我正在实现代码以使用 JSON。 func setup() { if let flickrURL = NSURL(string: "https://api.flickr.com/
我尝试使用for循环声明变量,然后测试cols和rols是否相同。如果是,它将运行递归函数。但是,我在 javascript 中执行 do 时遇到问题。有人可以帮忙吗? 现在,在比较 col.1 和
我举了一个我正在处理的问题的简短示例。 HTML代码: 1 2 3 CSS 代码: .BB a:hover{ color: #000; } .BB > li:after {
我是一名优秀的程序员,十分优秀!