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 获取新浪微博的最新公共微博实例分享
Jul 03 Python
CentOS中升级Python版本的方法详解
Jul 10 Python
python数据结构之链表的实例讲解
Jul 25 Python
关于python pyqt5安装失败问题的解决方法
Aug 08 Python
TensorFlow平台下Python实现神经网络
Mar 10 Python
pyQT5 实现窗体之间传值的示例
Jun 20 Python
python 动态迁移solr数据过程解析
Sep 04 Python
python集合常见运算案例解析
Oct 17 Python
django框架auth模块用法实例详解
Dec 10 Python
PyQt5多线程刷新界面防假死示例
Dec 13 Python
python爬取天气数据的实例详解
Nov 20 Python
python爬取豆瓣电影TOP250数据
May 23 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建立文件夹代码
2015/01/06 PHP
php文档工具PHP Documentor安装与使用方法
2016/01/25 PHP
PHP高并发和大流量解决方案整理
2019/12/24 PHP
优化JavaScript脚本的性能的几个注意事项
2006/12/22 Javascript
翻译整理的jQuery使用查询手册
2007/03/07 Javascript
又一个小巧的图片预加载类
2007/05/05 Javascript
CSS(js)限制页面显示的文本字符长度
2012/12/27 Javascript
jQuery实现用户注册的表单验证示例
2013/08/28 Javascript
jQuery获得IE版本不准确webbrowser的解决方法
2014/02/23 Javascript
JS实现浏览器状态栏显示时间的方法
2015/10/27 Javascript
JavaScript判断用户名和密码不能为空的实现代码
2016/05/16 Javascript
利用angularjs1.4制作的简易滑动门效果
2017/02/28 Javascript
js实现年月日表单三级联动
2020/04/17 Javascript
纯js实现的积木(div层)拖动功能示例
2017/07/19 Javascript
详解javascript 变量提升(Hoisting)
2019/03/12 Javascript
js实现左右轮播图
2020/01/09 Javascript
JavaScript编码小技巧分享
2020/09/17 Javascript
python实现DNS正向查询、反向查询的例子
2014/04/25 Python
python中pygame模块用法实例
2014/10/09 Python
编写Python爬虫抓取豆瓣电影TOP100及用户头像的方法
2016/01/20 Python
Window10+Python3.5安装opencv的教程推荐
2018/04/02 Python
Python tkinter label 更新方法
2018/10/11 Python
详解python中@的用法
2019/03/27 Python
基于腾讯云服务器部署微信小程序后台服务(Python+Django)
2019/05/08 Python
python如何删除文件中重复的字段
2019/07/16 Python
python写程序统计词频的方法
2019/07/29 Python
Python产生一个数值范围内的不重复的随机数的实现方法
2019/08/21 Python
Django单元测试中Fixtures的使用方法
2020/02/26 Python
python中sort sorted reverse reversed函数的区别说明
2020/05/11 Python
IE兼容css3圆角的实现代码
2011/07/21 HTML / CSS
C语言50道问题
2014/10/23 面试题
出国留学自荐信
2013/10/25 职场文书
作文批改评语大全
2014/04/23 职场文书
给客户的感谢信
2015/01/21 职场文书
党员转正党支部意见
2015/06/02 职场文书
2016大学生形势与政策心得体会
2016/01/12 职场文书