Python2.x利用commands模块执行Linux shell命令


Posted in Python onMarch 11, 2016

用Python写运维脚本时,经常需要执行linux shell的命令,Python中的commands模块专门用于调用Linux shell命令,并返回状态和结果,下面是commands模块的3个主要函数:

1. commands.getoutput('shell command')

执行shell命令,返回结果(string类型)

>>> commands.getoutput('pwd')

'/home/oracle'

2. commands.getstatus('file')

该函数已被python丢弃,不建议使用,它返回 ls -ld file 的结果(String)(返回结果太奇怪了,难怪被丢弃)

>>> commands.getstatus('admin.tar')

'-rw-rw-r-- 1 oracle oracle 829440 Jan 29 10:36 admin.tar'

3. commands.getstatusoutput('shell command')

执行shell命令, 返回两个元素的元组tuple(status, result),status为int类型,result为string类型。

cmd的执行方式是{ cmd ; } 2>&1, 故返回结果包含标准输出和标准错误.

>>> commands.getstatusoutput('pwd')

(0, '/home/oracle')

下面的一个脚本利用commands模块检测磁盘使用率,标识出大于10%的磁盘(百分比可根据实际情况调整,一般设为90%,本例为了更好的说明情况,设为10%):

import commands
threshold = 10
flag = False
title=commands.getoutput("df -h|head -1")
'''
Check sda disk space usage like below format:
/dev/sda2 20G 2.3G 17G 13% /
/dev/sda6 20G 306M 19G 2% /var
/dev/sda3 49G 2.8G 44G 7% /home
/dev/sda5 49G 4.5G 42G 10% /opt
/dev/sda1 194M 12M 172M 7% /boot
'''
chkDiskList=commands.getoutput("df -h|grep sda").split('\n')
usedPercents=commands.getoutput("df -h|grep sda|awk '{print $5}'|grep -Eo '[0-9]+'").split('\n')
for i in range(0,len(usedPercents)):
if int(usedPercents[i]) >= threshold:
chkDiskList[i] += ' ----Caution!!! space usage >= ' + str(threshold)
flag = True
'''
Check disk space usage like below format:
/dev/mapper/backup-backup_lv
751G 14G 699G 2% /backup
/dev/mapper/data-data_lv
751G 172G 540G 25% /data
''' 
chkDiskList_2=commands.getoutput("df -h|grep -v sda|grep -v tmp|grep -v system").split('\n')
usedPercents_2=commands.getoutput("df -h|grep -v map|grep -v sda|grep -v tmp|grep -v system|awk '{print $4}'|grep -Eo '[0-9]+'").split('\n')
for i in range(0,len(usedPercents_2)): 
if int(usedPercents_2[i]) >= threshold:
chkDiskList_2[i*2 + 1] += ' ----Caution!!! space usage >= ' + str(threshold)
flag = True
if flag == True:
#combine tile, chkDiskList, chkDisklist_2
result = [title,]
result.extend(chkDiskList)
result.extend(chkDiskList_2)
for line in result:
print line

假设当前的磁盘使用率如下:

[oracle@lx200 ~/admin/python]$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 20G 2.3G 17G 13% /
/dev/sda6 20G 306M 19G 2% /var
/dev/sda3 49G 2.8G 44G 7% /home
/dev/sda5 49G 4.5G 42G 10% /opt
/dev/sda1 194M 12M 172M 7% /boot
tmpfs 18G 0 18G 0% /dev/shm
/dev/mapper/backup-backup_lv
751G 14G 699G 2% /backup
/dev/mapper/data-data_lv
751G 174G 539G 25% /data

执行该脚本后的结果如下:

Filesystem Size Used Avail Use% Mounted on
/dev/sda2 20G 2.3G 17G 13% / ----Caution!!! space usage >= 10
/dev/sda6 20G 306M 19G 2% /var
/dev/sda3 49G 2.8G 44G 7% /home
/dev/sda5 49G 4.5G 42G 10% /opt ----Caution!!! space usage >= 10
/dev/sda1 194M 12M 172M 7% /boot
/dev/mapper/backup-backup_lv
751G 14G 699G 2% /backup
/dev/mapper/data-data_lv
751G 174G 539G 25% /data ----Caution!!! space usage >= 10

python Commands模块 使用方法

要获得shell命令的输出只需要`cmd`就可以了,
需要得到命令执行的状态则需要判断$?的值, 在Python中有一个模块commands也很容易做到以上的效果.

看一下三个函数:

1). commands.getstatusoutput(cmd)

用os.popen()执行命令cmd, 然后返回两个元素的元组(status, result). cmd执行的方式是{ cmd ; } 2>&1, 这样返回结果里面就会包含标准输出和标准错误.

2). commands.getoutput(cmd)

只返回执行的结果, 忽略返回值.

3). commands.getstatus(file)

返回ls -ld file执行的结果.

看一下这些函数使用的例子:

>>> import commands
>>> commands.getstatusoutput('ls /bin/ls')
(0, '/bin/ls')
>>> commands.getstatusoutput('cat /bin/junk')
(256, 'cat: /bin/junk: No such file or directory')
>>> commands.getstatusoutput('/bin/junk')
(256, 'sh: /bin/junk: not found')
>>> commands.getoutput('ls /bin/ls')
'/bin/ls'
>>> commands.getstatus('/bin/ls')
'-rwxr-xr-x 1 root 13352 Oct 14 1994 /bin/ls'
Python 相关文章推荐
wxpython 学习笔记 第一天
Mar 16 Python
Python Web框架Flask中使用七牛云存储实例
Feb 08 Python
10款最好的Web开发的 Python 框架
Mar 18 Python
python字典排序实例详解
May 20 Python
Python中import导入上一级目录模块及循环import问题的解决
Jun 04 Python
python如何实现内容写在图片上
Mar 23 Python
Python3导入自定义模块的三种方法详解
Apr 13 Python
如何用python整理附件
May 13 Python
python之线程通过信号pyqtSignal刷新ui的方法
Jan 11 Python
python 判断linux进程,并杀死进程的实现方法
Jul 01 Python
关于jupyter打开之后不能直接跳转到浏览器的解决方式
Apr 13 Python
虚拟机下载python是否需要联网
Jul 27 Python
Python实现列表转换成字典数据结构的方法
Mar 11 #Python
python中enumerate函数遍历元素用法分析
Mar 11 #Python
python实现class对象转换成json/字典的方法
Mar 11 #Python
Windows下Python的Django框架环境部署及应用编写入门
Mar 10 #Python
深入学习python的yield和generator
Mar 10 #Python
Python中random模块生成随机数详解
Mar 10 #Python
python生成器表达式和列表解析
Mar 10 #Python
You might like
PHP Directory 函数的详解
2013/03/07 PHP
php获取POST数据的三种方法实例详解
2016/12/20 PHP
PHP基于DOM创建xml文档的方法示例
2017/02/08 PHP
javascript while语句和do while语句的区别分析
2007/12/08 Javascript
原生javascript实现的分页插件pagenav
2014/08/28 Javascript
node.js中的favicon.ico请求问题处理
2014/12/15 Javascript
js简单工厂模式用法实例
2015/06/30 Javascript
javascript自动切换焦点控制效果完整实例
2016/02/02 Javascript
Javascript随机标签云代码实例
2016/06/21 Javascript
ECMAScript6轮播图实践知识总结
2016/08/17 Javascript
request请求获取参数的实现方法(post和get两种方式)
2016/09/27 Javascript
Nodejs进阶:核心模块net入门学习与实例讲解
2016/11/21 NodeJs
vue.js实现用户评论、登录、注册、及修改信息功能
2020/05/30 Javascript
vue子父组件通信的实现代码
2017/07/09 Javascript
javascript 中模板方法单例的实现方法
2017/10/17 Javascript
Angular利用内容投射向组件输入ngForOf模板的方法
2018/03/05 Javascript
vue实现简单loading进度条
2018/06/06 Javascript
详解Vue的常用指令v-if, v-for, v-show,v-else, v-bind, v-on
2018/10/12 Javascript
Cocos2d实现刮刮卡效果
2018/12/20 Javascript
layui 关闭open弹出框 刷新table表格页面的方法
2019/09/16 Javascript
redux处理异步action解决方案
2020/03/22 Javascript
python按照多个字符对字符串进行分割的方法
2015/03/17 Python
浅谈python图片处理Image和skimage的区别
2019/08/04 Python
PyTorch-GPU加速实例
2020/06/23 Python
基于django2.2连oracle11g解决版本冲突的问题
2020/07/02 Python
css3实现垂直下拉动画菜单示例
2014/04/22 HTML / CSS
澳大利亚在线时尚精品店:Hello Molly
2018/02/26 全球购物
Python里面如何实现tuple和list的转换
2012/06/13 面试题
心得体会范文
2014/01/04 职场文书
领导干部廉政自律承诺书
2014/05/26 职场文书
新闻发布会策划方案
2014/06/12 职场文书
青春飞扬演讲稿
2014/09/11 职场文书
工作经常出错的检讨书
2014/09/13 职场文书
管辖权异议上诉状
2015/05/23 职场文书
社区低保工作总结2015
2015/07/23 职场文书
关于windows server 2012 DC 环境 重启后蓝屏代码:0xc00002e2的问题
2022/05/25 Servers