如何让nvidia-smi输出同时显示并管道至其他命令以避免重复调用
只调用一次
nvidia-smi,同时输出到终端并处理管道 你当前的命令确实会两次调用nvidia-smi——一次用来提取PID,一次用来查询进程详情。要解决这个问题,我们可以通过两种常用方法实现单次调用+双重输出的需求:
方法1:用变量捕获输出(最直观易读)
先把nvidia-smi的输出一次性捕获到变量里,之后既可以打印输出到终端,又可以用这个变量来提取PID参数:
# 一次性获取nvidia-smi的完整输出 smi_result=$(nvidia-smi) # 先把原始输出打印到终端(满足你查看完整GPU信息的需求) echo "$smi_result" # 再从捕获的输出中提取PID,传给nvidia-smi ps命令 nvidia-smi ps -up $(echo "$smi_result" | tail -n +16 | head -n -1 | sed 's/\s\s*/ /g' | cut -d' ' -f3)
这种方法的好处是逻辑清晰,后续如果要调整提取PID的规则,直接修改变量处理的部分即可,也方便调试。
方法2:用tee+xargs实现单行命令
如果想写成一行命令,可以用tee把输出同时发送到终端和后续的处理管道,再用xargs把提取到的PID传给nvidia-smi ps:
nvidia-smi | tee >(cat) | tail -n +16 | head -n -1 | sed 's/\s\s*/ /g' | cut -d' ' -f3 | xargs nvidia-smi ps -up
这里的tee >(cat)是关键:它会把nvidia-smi的输出一份传给后续的管道处理PID,另一份通过cat输出到你的终端。xargs则会把提取到的所有PID作为参数传递给nvidia-smi ps -up,完美替代原来的反引号语法。
小提示:尽量用
$()替代反引号来做命令替换,$()支持嵌套,可读性也更强,是现代Shell的推荐写法。
内容的提问来源于stack exchange,提问作者Dang Manh Truong
相关产品推荐
相关产品推荐

