1

我有一个与此处提出的问题类似的问题:查找包含给定文件的文件系统的大小和可用空间,但该问题假设您已经对系统有所了解。

我有一个任务:对于数量不确定的机器,包括定期部署的新机器,我有/需要一个 python 脚本,如果任何分区太满,我可以向我报告。(是的,它是由 icinga2 部署的)。

我不做的是手工制作和个性化每台机器的脚本参数,以告知它我要检查的分区;我运行脚本,它只是向我报告系统上所有现存的分区。我让系统本身成为自己的权威,而不是从外部定义要检查的分区。这在 linux 中可以正常工作,正如上面链接的答案所示,在 linux 中,我们可以解析 /proc 中的文件以获取权威列表。

但我缺少的是一种从 python 获取 Mac OS X 中可靠分区列表的方法。

Mac OS X 没有 /proc,因此无法解析。我宁愿不调用外部二进制文件,因为我的目标是构建我的 python 脚本以在 linux 和 mac 客户端上运行。有任何想法吗?

4

2 回答 2

4

由于您想要一个跨平台(Mac 和 Linux)选项,您可以使用在两个平台上都可用的df命令。您可以通过subprocess访问它。

我已经为 OS X 10.11 和 Ubuntu Linux 15 测试过这个

import subprocess

process = subprocess.Popen(['df -h | awk \'{print $(NF-1),$NF}\''], stdout=subprocess.PIPE, shell=True)
out, err = process.communicate()
out = out.splitlines()[1:] # grab all the lines except the header line
results = {}
for i in out:
    tmp = i.split(' ')
    results[tmp[1]] = tmp[0]

for key, value in results.items():
    print key + " is " + str(value) +" full"

在 Mac 上输出

/dev is 100% full
/net is 100% full
/ is 82% full
/home is 100% full

Linux 上的输出

/dev is 1% full
/run/lock is 0% full
/run is 1% full
/ is 48% full

这里是你如何做到这一点awk

import subprocess

process = subprocess.Popen(['df', '-h'], stdout=subprocess.PIPE)
out, err = process.communicate()
out = out.splitlines()[1:] # grab all the lines except the header line

for i in out:
    tmp = i.split(' ')
    tmp2 = []
    for x in tmp:
        if x != '':
            tmp2.append(x)
    print tmp2[-1] + " is " + tmp2[-2] + " full" 
于 2016-02-17T23:52:16.783 回答
2

我不相信有一个统一的、跨平台的方式来做到这一点,但你可以使用该subprocess模块并$ diskutil list为 OS X调用这样的命令

import subprocess
p = subprocess.Popen(['diskutil', 'list'], stdout=subprocess.PIPE)
o = p.stdout.read()

o将包含diskutil命令的输出。

于 2016-02-17T23:31:25.363 回答