我最近发现可以通过附加组件扩展 KSysGuard File
-Download New Tabs
以显示附加信息。
![KSysGuard 的屏幕截图,显示 CPU 历史记录、内存历史记录、网络传输速率、核心温度和硬盘传输速率。此图像未正确呈现,因为 askubuntu.com 不允许使用新帐户上传图像。][https://i.imgur.com/zPpodNj.png]
我想用一张显示智能插头测量的功耗的图表来扩展此视图。智能插头正在运行 Web 服务器,我使用 Python 脚本查询功耗。为简单起见,让我们考虑这个占位符脚本,它打印 0 到 2500(含)之间的随机整数。
import random
power_consumption_watts = random.randint(0, 2500)
print(power_consumption_watts)
下一步是将此值以某种方式传送到 KSysGuard,但我不知道该怎么做。我发现插件创建了~/.local/share/ksysguard/*.sgrd
可能相关的新文件,但我不明白它们是如何工作的。
答案1
我搞明白了。KSysGuard 从程序中获取传感器值ksysguardd
,遗憾的是无法轻松扩展,但可以创建一个具有相同接口的程序,KSysGuard 可以从中读取新的传感器数据。这样的程序需要能够处理来自标准输入的以下命令:
monitors
,其中列出了所有可用的传感器,my_sensor_name\tinteger
或my_sensor_name\tfloat
成对的传感器,sensorname
,打印传感器的值,sensorname?
,打印传感器的显示名称、最小值、最大值和单位,同样用制表符分隔。
每个输出后应该只有一个换行符。此外,在每个命令之前,ksysguard>
无需打印换行符。注意尾随空格。由于 KSysGuard 对确切格式非常挑剔,我在下面添加了一个 Python 脚本,该脚本应该很容易扩展到其他传感器。
如何添加其他传感器:
- 创建一个函数来从某处获取传感器值。
- 在字典中创建一个新条目
sensors
。填写:- 字典条目的传感器名称/键(一定不包括空格!)
- 新传感器的显示名称。
- 单位(MB、°C、kg、瓦特等)
- 数据类型(
float
或integer
) - 最小值。
- 最大值。
- 获取值的函数。
如何让新的传感器出现在 KSysGuard 中:
- 将 Python 脚本文件标记为可执行文件:
chmod +x fake_ksysguardd.py
- 在 KSysGuard 中,转到文件 - 新选项卡...
- 输入新标签的标题。
- 单击“确定”。
- 转到文件-监控远程机器...
- 输入任意内容作为主机名。
- 选择“自定义命令”。
- 输入此文件的完整绝对路径。
- 单击“确定”。
- 新的传感器现在应该出现在传感器浏览器中。
- 将传感器从传感器浏览器拖放到“将传感器拖放到此处”字段,查看一切是否正常工作。
新标签页通常存储在~/.local/share/ksysguard/MyNewTab.sgrd
![KSysGuard 中检测到的传感器的屏幕截图。此图像未正确嵌入,因为 askubuntu.com 不允许使用新帐户上传图像。][https://i.imgur.com/AYh6Eln.png]
#!/usr/bin/env python3
import random
def get_sensor1_value():
return random.random() * 1000
sensors = {
"my_sensor1": {
"display_name": "My Custom Sensor 1",
"unit": "MB",
"value_type": "float",
"min_value": 0,
"max_value": 1000,
"get_value": get_sensor1_value,
},
"my_sensor2": {
"display_name": "My Custom Sensor 2",
"unit": "°C",
"value_type": "integer",
"min_value": -100,
"max_value": 100,
"get_value": lambda: random.randint(-100, 100),
},
}
def process_command(command):
# Print available sensors
if command == "monitors":
for sensor_name, sensor_info in sensors.items():
value_type = sensor_info["value_type"]
print(f"{sensor_name}\t{value_type}")
return
for sensor_name, sensor_info in sensors.items():
# Fetch and print sensor value
if command == sensor_name:
get_value_func = sensor_info["get_value"]
value = get_value_func()
print(value)
return
# Print sensor name, range and unit
if command == sensor_name + "?":
display_name = sensor_info["display_name"]
unit = sensor_info["unit"]
min_value = sensor_info["min_value"]
max_value = sensor_info["max_value"]
print(f"{display_name}\t{min_value}\t{max_value}\t{unit}")
return
print("UNKNOWN COMMAND")
try:
print("ksysguardd 1.2.0")
while True:
print("ksysguardd> ", end="", flush=True)
# Wait for new command
command = input()
process_command(command)
except KeyboardInterrupt:
pass
except EOFError:
pass
如果你更喜欢 Perl,还有这个很好的脚本可以在 KSysGuard 中显示 NVIDIA GPU 信息