#!/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()
Run Code Online (Sandbox Code Playgroud)
这是使用smartmontools和lm-sensors监控Python温度的小脚本.但是,当我尝试运行它时,我有一个错误
subprocess.CalledProcessError: Command '['smartctl', '-A', '/dev/sda2']' returned non-zero exit status 2
Run Code Online (Sandbox Code Playgroud)
但是当我在终端中手动尝试此命令时,它们工作得很好.
一些信息:
uname -a
Run Code Online (Sandbox Code Playgroud)
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如果被调用进程返回任何非零退出代码,则将引发A. 在命令行中,您应该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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
29950 次 |
| 最近记录: |