python自动化运维记录
周蓝捷+方韓+李文惠
摘 要:文章是关于Python在地震监测服务器环境中的应用,使用Python及扩展包进行简易烈度计地震监测服务器运维监控、信息分析和发布。以常见的信息推送、延时统计、数据有效率统计、格式转换及简单数据分析过程提供了例程。
关键词:Python;简易烈度计;运维监控
中图分类号:P315.73 文献标志码:A 文章编号:2095-2945(2017)26-0151-02
1 概况
在福建省简易烈度计地震预警项目实施中,厦门地震勘测研究中心承担项目中简易烈度计站点的勘选、安装、组网建设等工作。在实施过程中,中心在Linux操作系统上,采用Earthworm技术系统搭建了简易烈度计数据处理平台。为了更好的监控系统运行状态,减轻值班人员工作量,采用Python语言编写了系统运行状态监控与信息发布程序。
Python是一门简单易学且功能强大的编程语言。它由荷兰人Guido van Rossum于1989年发明,第一个公开发行版发行于1991年。Python是纯粹的自由软件, 源代码和解释器CPython遵循 GPL(GNU General Public License)协议。它拥有高效的高级数据结构,并且能够用简单而又高效的方式进行面向对象编程。Python简单易学,并具有跨平台特性,虽然运行效率不高,但并不成为瓶颈,不影响系统表现,但开发效率极高,能够帮助运维人员快速达成开发目标。
在开发的过程中,主要使用了Python中的Numpy、Matplotlib、Bsemap和Obspy等扩展包。
2 在烈度计系统运维中的应用
2.1 运维信息使用企业号推送
#定制并获取用户关心的内容content,通过企业号发送出去
#gettoken和senddata两个函数内容略,可直接复用
corpid = 'qiyehaoID'
corpsecret = 'qiyehaoMIYAO'
#获取token
accesstoken = gettoken(corpid,corpsecret)
#系统通知相关变量
user = '1|2|21|zlj|35|36|37|62|63|64|zsp'
#给user发送
contents=getcontent()
senddata(accesstoken,user,contents)
2.2 烈度计数据处理
2.2.1 OBSPY.EARTHWORM.CLIENT应用
#实时获取Earthworm服务器中台站数据当前的延时
from obspy.clients.earthworm import Client
from obspy import UTCDateTime
clientZ = Client("10.35.176.14", 16022, timeout=5)
t = UTCDateTime()
print("Process started at:", t)
responses =clientZ.get_availability(network="FJ")
delays=()
for response in responses:
delays += (response[1],response[5],t-response[5])
print('site:',response[1],'last received:',response[5],'delay is:',float(t-response[5]))
delayinseconds=delays[2::3]
delaymax=max(delayinseconds)
delaymin=min(delayinseconds)
print('current time is',t,'.processed',len(delays)/3,'sites.')
print('max delay of above is:',delaymax,'and min is:',delaymin)
2.2.2 OBSPY-SCAN應用
我们经常会有一堆数据,但是要处理的事件只是其中几分钟,我们想看看其中有哪些台站是可以用的,或者,我们想知道这段时间整个台网运行的情况。ObsPy提供了obspy-scan脚本可供使用。它在文件头中检数据文件格式(支持MiniSEED、SAC、SACXY、GSE2、SH-ASC、SH-Q、SEISAN等等),通过计算,以红色竖线绘制出断记,以小叉表示数据起始点,将整个数据文件的有效性直观的展现出来。这个脚本工具可以一次性扫描超过1000个文件(实际上已经在超过30000个文件的序列中运用过,计算持续时间45分钟)。它能够自动的将数据文件对应的年份月份绘制出来。对于绘制结果,我们还可以对关心的片段进行放大。
如下简单的一个指令即可进行数据文件扫描:
$obspy-scan /home/xmzk/357/*HLZ.mseed -o 357report.png
图1 obspy-scan的结果
2.2.3 波形按震中距排序分布图的绘制
以2016年10月31日16:26分广东梅州3.6级地震事件中,福建省漳州市境内128个简易烈度计的数据记录,做简单的震中距排序分布图为例:endprint
#在列表中查询台站经纬度,计算震中距,0.1-10Hz带通滤波,做震中距排序分布图
#关键部分代码
for sta in stas:
y,x=os.popen("grep "+sta+" /root/allstation | awk '{print $2,$3}'").read().split()
stZs.select(station=sta)[0].stats.stla=float(x)
stZs.select(station=sta)[0].stats.stlo=float(y)
for sts in stZs:
sts.stats.distance=gps2dist_azimuth(sts.stats.stla,sts.stats.stlo,eq_lat,eq_lon)[0]
Zstf=stZs.filter('bandpass',freqmin=0.1,freqmax=10)
Zstf.plot(type='section')
plt.savefig('/root/imgs/Z-section-'+et+'.png')
2.2.4 数据文件的抽取和格式的转换
#对给定的miniseed文件,抽取指定时间的数据片段,并转换为SAC格式
from obspy import read,Stream,UTCDateTime
import numpy as np
import os,datetime
pa=input("请输入数据文件完整路径,以'/'结束( eg. /home/xmzk/mseed/FJ/2016/305/,当前目录 ./ ):")
et=input("请输入有效起始UTC时刻,格式YYYYMMDD-HHMM( eg. 20161030-0826 ):")
drt=input("请输入需要取出的时间长度,单位整数秒( eg. 300 ):")
dt=UTCDateTime(datetime.datetime.strptime(et,'%Y%m%d-%H%M'))
stZs=read(pa+"*HLZ*.mseed",starttime=dt,endtime=dt+int(drt)).merge().sort()
for sts in stZs:
if hasattr(sts.data,'mask'):
sts.data=sts.data.filled(0)
for sts in stZs:
sts.write('./'+sts.id+'.SAC',format='SAC')
3 小結与展望
采用Python语言及相应的扩展包能够提高地震学项目的开发效率,能够减少在计算机编程语言方面的学习时间,成倍的提升数据处理工作效率,能够提供丰富的图形可视化结果,具有光明的前景,是值得学习并使用的高级计算机语言之一。
参考文献:
[1]Python Tutorial.http://www.pythondoc.com/pythontutorial3/index.html.
[2]TIOBE.http://www.tiobe.com/.
[3]Numpy.http://www.numpy.org/.
[4]Matplotlib.http://matplotlib.org/.
[5]Basemap.http://matplotlib.org/basemap/.
[6]ObsPy Tutorial.http://docs.obspy.org/tutorial/.endprint