用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%):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
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
|
假设当前的磁盘使用率如下:
1
2
3
4
5
6
7
8
9
10
11
12
|
[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
|
执行该脚本后的结果如下:
1
2
3
4
5
6
7
8
9
10
|
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执行的结果.
看一下这些函数使用的例子:
1
2
3
4
5
6
7
8
9
10
11
|
>>> 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'
|