什么是异常

a=8950/0              ZeroDivisioonError: division by zero

print (a)

**************

b = [1,2]

c = b[2]

print (b+c)             IndexError:List index out of range

当解释器遇到错误的(无法执行)代码,中断当前代码的执行,抛出一个异常对象

异常的捕获和处理

例子:

输入0会导致当前程序的异常退出

while True:

  num = input ('input a number:)

  print ('10000 / %s = %s' %(num,10000.0/int(num)))

捕获一种异常

关键字 try ...except...

try :
  b = 4/0

except  ZeroDivisioonError:

  print ('handle  ZeroDivisioonError‘)

try 代码块指明作用域,若出现错误try里面的后面的代码不再执行

except 代码块是异常处理的代码

捕获多钟类型的错误

try :

  ohmy

  b = 4/0

except ZeroDivisioonError:

  print(''handle  ZeroDivisioonError‘)

except NameError;

  print('handle NameError')

执行结果:是NameError

 得到异常对象

捕获后得到详情的异常信息

try:

  ohmy

except NameError as e:

  print('handle NameError:',e)

e就是异常对象

我们可以打印出里面存储的具体错误信息

捕获所有异常

try:

  ohmy

  4/0

except Exception as e:

  print('handle unkown exception:',e)

Exception 指明所有异常(父类)

可简写成

try:

  ohmy

except:

  print('handle unkown exception:')

如果想要知道异常信息

import traceback    获取异常信息和行号及代码的调用信息,用于日志文件

try:

  ohmy

except:

  print('handle unkown exception\n'+\

    traceback.format_exc())

finally语句

不管是否有异常,我们都要执行一段代码

try:

  b = 4/0

  ohmy

except ZerodivisionError:

  print('handle ZerodivisionError')

except NameError:

  print('handle NameError')

except:

  print('handle unkown exception')

finally:

  print('in finally')

finally 一定要放在最后,用于环境清除

else 没有异常的情况下,要执行一段代码

try:

 print('do something')

except ZerodivisionError:

  print('handle ZerodivisionError')

except NameError:

  print('handle NameError')

except:

  print('handle unkown exception')

else:

  print('haha, no exception')

finally:

  print('in finally')

else 必须跟在所有的except代码块后面

在finally前面

函数调用栈

异常从调用栈里抛出

远程控制Linux

经常和Linux打交道:

产品的运行环境,互联网行业:web server ,Web APP,Mobile APP;通信行业:AAA、BOSS、业务控制...

经常用到远程操作Linux:自动安装产品到Linux,自动化用例的一些步骤,运维:环境监控,数据的自动获取、分析

python的解决方案:Paramiko、Pexpect

安装Paramiko执行下面的命令:

pip install paramiko --default-timeout=60

pip install paramiko -i https://pypi.douban.com/simple/

Linux主机设置:保证有一台Linux主机:自己搭建虚拟机,如果没有临时使用云主机;保证ssh服务开启,用putty连接

示例代码

SSHClicent

import paramiko

ssh = paramiko.SSHClient()  #创建SSHClient实例对象

ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())   #调用方法,表示没有存储远程机器的公钥,允许访问

ssh.connect(hostname,port,user,passwd)                   #连接远程机器,地址、端口(一般为22),用户名,密码

stdin,stdout,stderr = ssh.exec_command("mkdir abc;touch file1 file2;ls")

print (stdout.read())

ssh.close()

例子

import paramiko

ssh = paramiko.SSHClient()  #创建SSHClient实例对象

ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())   #调用方法,表示没有存储远程机器的公钥,允许访问

ssh.connect(hostname,port,user,passwd)                   #连接远程机器,地址、端口(一般为22),用户名,密码

cmd = 'mkdir abc'                               #创建目录

ssh.exec_command(cmd)

cmd = ''' echo '1234          #命令跨行

5678

90abc' >myfile

'''

ssh.exec_command(cmd)

cmd = 'cat myfile'     #获取命令的执行结果

stdin,stdout,stderr = ssh.exec_command(cmd)

print (stdout.read() +stedrr.read())

ssh.close()

exec_command 每次执行会新打开一个channel执行,新的环境不在上次执行的环境里面,所以我们不能多次调用,达到多次执行的目的

可以多个命令一起执行,用分号隔开

获取数据进行分析

例如内存使用 date +%Y%m%d_%H%M%S;free

运输文件到远程机器

sftp = ssh.open_sftp()

sftp.put('ftp1.py','/home/stt/ftp3.py')

sftp.close()

获取统计 远程Linux主机的 可用内存率。

安装 paramiko :  执行pip install paramiko

安装虚拟机管理器 virtualbox 或者 vmvareplayer, 创建 64位 虚拟机,
安装centos镜像 cetos6.9 下载地址 :
http://mirrors.163.com/centos/6.9/isos/x86_64/CentOS-6.9-x86_64-bin-DVD1.iso Putty 下载地址 :
https://the.earth.li/~sgtatham/putty/0.70/w32/putty-0.70-installer.msi 然后编写一个python程序,代码文件名为 memory.py , 该代码文件 计划在远程Linux机器运行。该程序做如下的事情:
每隔5秒钟 打开文件 /proc/meminfo,该文件包含了系统内存使用信息,前面数行内容如下 MemTotal: 1920648 kB
MemFree: 87788 kB
Buffers: 229704 kB
Cached: 1180244 kB memory.py 程序要将 memFree 、buffers、cached 的值 相加 (结果是可用内存的数量)。
然后除以 MemTotal的值, 得到可用内存占的百分比(赋值给变量 avaMem)。
将 avaMem 的数值存入 结果文件ret.txt中。 上面的程序一直运行,每隔 5秒钟 获取记录一次 avaMem 对应的时间戳, 格式如下
20170315_12:10:00 77%
20170315_12:10:05 74%
20170315_12:10:10 70%
20170315_12:10:15 72% 再编写一个python程序,代码文件名为 auto.py,该程序运行起来做如下工作:
以自己名字的拼音(比如lixia) 在远程机器建立一个目录 。如果该目录已经存在则跳过此步骤
拷贝文件memory.py 到远程机器该目录下面,
远程在Linux主机执行文件 memory.py
过5分钟后,将远程文件memory.py执行产生的结果文件ret.txt 内容拷贝回本机

参考答案,往下翻

memory.py

# coding=utf8
import time # MemTotal: 1920648 kB
# MemFree: 87788 kB
# Buffers: 229704 kB
# Cached: 1180244 kB
def getContent(lines,field):
for line in lines:
if field in line:
value = line.split(':')[1].split('kB')[0].strip()
return int(value) # count 用来时间上计数,防止一直运行
count = 0
while True:
count += 1 with open('/proc/meminfo') as f:
beginlines = f.readlines()[:8] memTotal = getContent(beginlines,'MemTotal')
memFree = getContent(beginlines,'MemFree')
buffers = getContent(beginlines,'Buffers')
cached = getContent(beginlines,'Cached') # print memTotal,memFree,buffers,cached
# 别忘了 * 100
memUsage = (memFree + buffers + cached) *100.0/memTotal
# 搜索时间格式
memUsage = '%s %.2f%%' % (time.strftime('%Y%m%d_%H:%M:%S'),memUsage)
print(memUsage) with open('ret.txt','a') as f:
f.write(memUsage+'\n') time.sleep(5) # 防止一直运行
if count>15:
break

auto.py

# coding=utf8
import paramiko,time ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect("120.26.96.231",22,"stt", "stt0707") # 创建自己名字的目录
dirName = "jcy" # 先检查 是否已经存在同名目录了, 如果没有则创建
stdin, stdout, stderr = ssh.exec_command("ls")
dircontent = stdout.read()
print(dircontent)
if dirName in dircontent.splitlines():
print('{} already exists'.format(dirName))
else:
print('make dir {}'.format(dirName))
ssh.exec_command("mkdir {}".format(dirName)) # 传输文件
sftp = ssh.open_sftp()
sftp.put('memory.py', '{}/memory.py'.format(dirName))
sftp.close() # 检查文件是否传输成功,可以将检查文件是否存在机器,做成一个函数。。。 # 执行脚本 # 考虑到长时间没有消息,网络连接可能会被断开。 到网上搜索一番后。
# 设置一个保持连接的参数
transport = ssh.get_transport()
transport.set_keepalive(30) print('remote exec python memory.py')
ssh.exec_command("cd %s; python memory.py" % dirName) print('wait for 30 seconds...')
time.sleep(30) # 传输文件
sftp = ssh.open_sftp()
sftp.get('{}/ret.txt'.format(dirName),'ret.txt')
sftp.close() ssh.close()

异常+远程控制Linux-14的更多相关文章

  1. Linux 14.04lts 环境下搭建交叉编译环境arm-linux-gcc-4.5.1

    交叉编译工具链是为了编译.链接.处理和调试跨平台体系结构的程序代码,在该环境下编译出嵌入式Linux系统所需要的操作系统.应用程序等,然后再上传到目标板上. 首 先要明确gcc 和arm-linux- ...

  2. Window VNC远程控制LINUX:VNC详细配置介绍

    Window VNC远程控制LINUX:VNC详细配置介绍 //---------------------------------------vnc linux下的详细配置 1.VNC的启动/停止/重 ...

  3. 手机上如何远程控制Linux服务器?

    这里介绍3个手机软件,分别是JuiceSSH.Termius和Termux,这3个软件都可以实现远程控制Linux服务器(相当于手机SSH客户端),而且使用起来都非常方便,下面我简单介绍一下这3个软件 ...

  4. WINDOWS远程控制LINUX终端XSHELL

    WINDOWS远程控制LINUX终端XSHELL 笔者购买的腾讯云CENTOS7,通过腾讯云的控制台登录,每次都要打开相关网页.输入密码,感觉操作非常不方便. 使用XSHELL远程控制LINUX终端, ...

  5. VNCServer,SSH Secure Shell Client,window远程控制linux

    1.VNC远程连接linux图形化桌面 2.SSH Secure Shell Client连接linux终端 3.设置FTP与linux传输文件 1.VNC远程连接linux图形化桌面 在centos ...

  6. Toad for MySQL 7.3 Freeware异常 2017-01-09 15:14 115人阅读 评论(0) 收藏

    打开Toad出现如下异常信息: 解决办法: 重装.NET Framework4.0

  7. yum异常: [Errno 14] PYCURL ERROR 22 - "The requested URL returned error: 404 Not Found"

    http://people.centos.org/hughesjr/chromium/6/x86_64/repodata/repomd.xml: [Errno 14] PYCURL ERROR 22 ...

  8. Ubuntu Linux 14.04 LTS 上安装php7+mysql+nginx

    输入 $ sudo apt-get install -y language-pack-en-base$ sudo LC_ALL=en_US.UTF-8 add-apt-repository ppa:o ...

  9. 在 Ubuntu Linux 14.04 LTS 上安装php7

    首先添加php官方源 $ sudo add-apt-repository ppa:ondrej/php 然后更新源 $ sudo apt-get update 然后安装 $ sudo apt-get ...

随机推荐

  1. react事件中的this指向

    在react中绑定事件处理函数的this指向一共有三种方法,本次主要总结这三种方式. 项目创建 关于项目的创建方法,在之前的文章中有记录,这里不再赘述,项目创建成功后,按照之前的目录结构对生成的项目进 ...

  2. vue之v-model

    上一篇文章总结了v-bind的用法,我们发现v-bind实现了数据的单向绑定,将vue实例中的数据同元素属性值进行绑定,今天我们将总结vue中的数据双向绑定v-model. v-model实现双向绑定 ...

  3. 百度地图api公交路线,IE下跳转百度地图后中文变成乱码的解决办法

    百度开放的公交路线的链接,IE跳转会出现中文变成乱码的问题.如图: //创建InfoWindow function createInfoWindow() { var desDiv = []; desD ...

  4. PHP中的static的理解

    静态方法 (1)静态方法不能访问这个类中的普通属性,因为那些属性属于一个对象,但可以访问静态属性: (2)从当前类(不是子类)中访问静态方法或属性,可以使用 self 关键字,self 指向当前类,就 ...

  5. [UE4]RetainerBox,控制UI更新频率,把渲染后的UI当成Texture

    RetainerBox是一个容器,只会影响其容器内的UI,RetainerBox的作用: 一.控制UI更新频率(可能是为有优化性能) 1.在UserWidget中添加Retainer Box容器,并在 ...

  6. 本机无法访问虚拟机里面的nginx的80端口

    在虚拟机VMware上装好了centos6.9,并配好了nginx,但是本机就是无法访问.具体情况如下1.本机能ping通虚拟机2.虚拟机也能ping通本机3.虚拟机能访问自己的web4.本机无法访问 ...

  7. tips:Java中while的判断条件

    tips:Java中while的判断条件! 在c++中,有时候会遇到这种情况: while(x = y){ dosomething; } 如果x与y相等,这个时候如果循环体中没有跳出的点,那么会无限循 ...

  8. KVM总结-KVM性能优化之网络性能优化

    前面已经介绍了KVM CPU优化(http://blog.csdn.net/dylloveyou/article/details/71169463).内存优化(http://blog.csdn.net ...

  9. C#winform抓取百度,Google搜索关键词结果

    基于网站seo,做了一采集百度和Google搜索关键字结果的采集.在这里与大家分享一下 先看先效果图 代码附加:  1   private void baidu_Click(object sender ...

  10. svn下copy项目后定位到新资源库,产生不同版本号的方法

    转载于http://blog.csdn.net/u012990533/article/details/44776465 最近这两天,公司要做国际化的开发,本打算要用struts2内置的i18n拦截器做 ...