如何用Python结合Cron定时远程监控多台机器GPU状态?
完全可行,以下是具体实现方案:
实现步骤
1. 前置准备
- 本地与所有远程GPU机器配置SSH免密登录:生成本地SSH密钥对,将公钥上传至每台远程机器的
~/.ssh/authorized_keys文件,避免脚本执行时需手动输入密码。 - 远程机器需安装NVIDIA驱动(确保
nvidia-smi命令可正常执行)。 - 本地机器安装Python3及依赖:
pip install paramiko(用于SSH远程执行命令)。
2. Python监控脚本实现
脚本核心逻辑:遍历远程机器列表,通过SSH连接执行格式化的nvidia-smi命令,解析输出并写入日志。
示例代码:
import paramiko import datetime # 远程机器配置列表,格式为(IP, SSH端口, 用户名) REMOTE_MACHINES = [ ("192.168.1.10", 22, "user1"), ("192.168.1.11", 22, "user2"), # 按需添加更多机器 ] # 日志文件存储路径 LOG_FILE = "/var/log/gpu_monitor.log" def fetch_gpu_status(host, port, username): try: # 建立SSH连接 ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(host, port=port, username=username) # 执行格式化nvidia-smi命令,提取关键指标 cmd = "nvidia-smi --query-gpu=timestamp,name,utilization.gpu,memory.used,memory.total --format=csv,noheader,nounits" _, stdout, stderr = ssh.exec_command(cmd) output = stdout.read().decode().strip() error = stderr.read().decode().strip() ssh.close() if error: return f"[{host}] 获取GPU状态失败: {error}" else: # 解析单台机器的多GPU数据 gpu_records = output.split("\n") formatted_records = [f"[{host}] {record}" for record in gpu_records if record] return "\n".join(formatted_records) except Exception as e: return f"[{host}] 连接失败: {str(e)}" def main(): # 生成监控时间标记 current_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") log_content = f"\n=== 监控快照: {current_time} ===\n" # 遍历所有远程机器获取状态 for host, port, username in REMOTE_MACHINES: log_content += fetch_gpu_status(host, port, username) + "\n" # 追加写入日志 with open(LOG_FILE, "a", encoding="utf-8") as f: f.write(log_content) if __name__ == "__main__": main()
3. 配置Cron定时任务
在本地机器配置Cron,实现每小时自动执行脚本:
- 打开Cron编辑界面:
crontab -e - 添加以下配置(替换脚本路径为实际路径):
0 * * * * /usr/bin/python3 /path/to/your/gpu_monitor.py >> /var/log/gpu_monitor_cron.log 2>&1
0 * * * *表示每小时整点执行/usr/bin/python3为Python3的绝对路径(可用which python3查询)- 末尾的日志重定向用于记录Cron执行脚本的状态(可选,用于排查执行问题)
4. 优化建议
- 日志轮转:配置
logrotate对日志文件进行自动切割,避免文件过大。 - 异常告警:添加邮件/企业微信通知逻辑,当GPU利用率过高或显存不足时触发告警。
- 结构化数据采集:若需更精准的指标,可在远程机器安装
pynvml库,直接通过Python调用NVIDIA管理接口获取数据,无需解析命令输出。
内容的提问来源于stack exchange,提问作者Nagabhushan S N
相关产品推荐
相关产品推荐

