什么是异常

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. 【maven】之打包不带版本号的问题

    今天在写maven项目的时候发现打包没有带版本号,只有包名 百思不得其解,我翻看之前的项目发现并没有这种情况,最后看了一下文档 发现是自己在build中写了fileName  导致的!删除自定义的fi ...

  2. 廖雪峰Java6 IO编程-2input和output-5操作zip

    1.ZipInputStream是一种FilterInputStream 可以直接读取zip的内容 InputStream->FilterInputStream->InflateInput ...

  3. intent--Activity之间数据传递之Intent数据传递

    intent传值: 4,intent传集合 3,intent传对象, 2,传递后有返回值的情况:当需要从目标Activity回传数据到原Activity时,可以使用上述方法定义一个新的Intent来传 ...

  4. Java中涉及线程和并发相关的内容

    1:线程池 与每次需要时都创建线程相比,线程池可以降低创建线程的开销,这也是因为线程池在线程执行结束后进行的是回收操作,而不是真正的 销毁线程. 2:ReentrantLock ReentrantLo ...

  5. Find the peace with yourself

    The purpose of being mature is to find the real calm and peace with yourself. Or you can say the tur ...

  6. CRM 2016 刷新 Iframe

    在CRM中刷新IFame: /// <summary>刷新Iframe的内容,用于表单上刷新iframe里的内容</summary> var iframe = Xrm.Page ...

  7. TensorFlow安装教程(ubuntu 18.04)

    此教程的硬件条件: 1.Nvidia GPU Geforce390及以上 2.Ubuntu 18.04操作系统 3.Anaconda工具包 如果python版本为3.7及以上,使用如下命令降级到3.6 ...

  8. 查看hbase中的中文

    python: print '\xE4\xB8\xAD\xE5\x9B\xBD\xE7\x9A\x84\xE4\xB8\x8A\xE5\x8D\x88'.decode('utf-8')

  9. WebUploader 手机端上传图片(转)

    https://blog.csdn.net/loserorleader/article/details/50395040

  10. Select模式和超时

    fd_set rset; FD_ZERO(&rset); int nready; int maxfd; int fd_stdin = fileno(stdin); if(fd_stdin &g ...