#!/usr/bin/env python # encoding: utf-8 import re import subprocess import time import json def get_temperatures(disks): sensors = subprocess.check_output(["sensors"]) temperatures = {match[0]: float(match[1]) for match in re.findall("^(.*?)\:\s+\+?(.*?)°C", sensors, re.MULTILINE)} for disk in disks: output = subprocess.check_output(["smartctl", "-A", disk]) temperatures[disk] = int(re.search("Temperature.*\s(\d+)\s*(?:\([\d\s]*\)|)$", output, re.MULTILINE).group(1)) return temperatures def main(): while True: print json.dumps(get_temperatures(("/dev/sda2", "/dev/sdb1"))) time.sleep(20) if __name__ == '__main__': main()
这是一个使用smartmontools和lm-sensors监测Python温度的小脚本。 但是,当我尝试运行它,我有一个错误
subprocess.CalledProcessError: Command '['smartctl', '-A', '/dev/sda2']' returned non-zero exit status 2
但是当我在terminal手动尝试这个命令,他们工作得很好。
一些信息:
uname -a
Linux LME 4.0.0-040000-generic#201504121935 SMP Sun Apr 12 23:36:33 UTC 2015 x86_64 x86_64 x86_64 GNU / Linux
如果被调用的进程返回非零的退出代码,则会引发CalledProcessError
。 在命令行上,你应该echo $?
得到最后的返回码,看看它是否真的返回2.我怀疑它会。
如果在你的python代码中没问题的话,你可以除了CalledProcessError
外,还可以从属性中获取任何信息,尤其是output
属性。 (在Python文档中查找这个错误了解更多信息。)
例:
import subprocess output = None try: output = subprocess.check_output(["smartctl", "-A", "/dev/sda2"]) except subprocess.CalledProcessError as e: output = e.output
来自smartctl
返回码2表示无法打开设备。 确保运行Python代码的用户有权打开您希望检查的所有磁盘。
从smartctl手册页的RETURN VALUES部分:
位1:设备打开失败,或设备没有返回一个IDENTIFY DEVICE结构
所以我怀疑这确实是一个权限问题。 我在我的系统上验证了这一点。 如果我运行subprocess.check_output( [ 'smartctl', '-A', '/dev/sda2' ] )
我得到的错误返回2,但如果我运行subprocess.check_output( [ 'sudo', 'smartctl', '-A', '/dev/sda2' ] )
它工作,我看到命令的输出。