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 相关文章推荐
跟老齐学Python之大话题小函数(1)
Oct 10 Python
Python的批量远程管理和部署工具Fabric用法实例
Jan 23 Python
浅谈Python的垃圾回收机制
Dec 17 Python
python+VTK环境搭建及第一个简单程序代码
Dec 13 Python
matplotlib作图添加表格实例代码
Jan 23 Python
python使用锁访问共享变量实例解析
Feb 08 Python
Tensorflow使用tfrecord输入数据格式
Jun 19 Python
python爬虫之urllib3的使用示例
Jul 09 Python
Python面向对象总结及类与正则表达式详解
Apr 18 Python
用python给自己做一款小说阅读器过程详解
Jul 11 Python
python3利用Axes3D库画3D模型图
Mar 25 Python
细说NumPy数组的四种乘法的使用
Dec 18 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+mysql事务rollback&commit示例
2010/02/08 PHP
php smarty 二级分类代码和模版循环例子
2011/06/01 PHP
PHP中extract()函数的定义和用法
2012/08/17 PHP
Thinkphp5+plupload实现的图片上传功能示例【支持实时预览】
2019/05/08 PHP
JS对img进行操作(换图片/切图/轮换/停止)
2013/04/17 Javascript
javascrip关于继承的小例子
2013/05/10 Javascript
javascript间隔刷新的简单实例
2013/11/14 Javascript
类似php的js数组的in_array函数自定义方法
2013/12/27 Javascript
JavaScript取得键盘按下方向键是哪个的方法
2015/08/04 Javascript
基于jQuery实现点击弹出层实例代码
2016/01/01 Javascript
jQuery获取及设置表单input各种类型值的方法小结
2016/05/24 Javascript
angular4模块中给标签添加背景图的实现方法
2017/09/15 Javascript
使用js在layui中实现上传图片压缩
2019/06/18 Javascript
js如何获取访问IP、地区、当前操作浏览器
2019/07/23 Javascript
Javascript查看大图功能代码实现
2020/05/07 Javascript
[08:44]和酒神一起战斗 DOTA2教你做大人
2014/03/27 DOTA
python单链表实现代码实例
2013/11/21 Python
Python tempfile模块学习笔记(临时文件)
2014/05/25 Python
python字符类型的一些方法小结
2016/05/16 Python
Python之父谈Python的未来形式
2016/07/01 Python
浅谈Python中的作用域规则和闭包
2018/03/20 Python
Python3实现监控新型冠状病毒肺炎疫情的示例代码
2020/02/13 Python
Jupyter Notebook输出矢量图实例
2020/04/14 Python
python安装和pycharm环境搭建设置方法
2020/05/27 Python
苹果香港官方商城:Apple香港
2016/09/14 全球购物
美国爆米花工厂:The Popcorn Factory
2019/09/14 全球购物
Pharmacy Online中文直邮网站:澳洲大型药房
2020/06/27 全球购物
YII2 全局异常处理深入讲解
2021/03/24 PHP
纠风工作实施方案
2014/03/15 职场文书
门前三包责任书
2014/04/15 职场文书
幼儿园运动会口号
2014/06/07 职场文书
火箭队口号
2014/06/18 职场文书
本科毕业论文致谢怎么写
2015/05/14 职场文书
2015年高三班主任工作总结
2015/05/21 职场文书
优秀班干部主要事迹材料
2015/11/04 职场文书
Python查找算法的实现 (线性、二分,分块、插值查找算法)
2022/04/24 Python