使用Go语言exec执行Linux top命令时进程名显示异常
解决Go执行top命令进程名被截断的问题
问题原因
top的批处理模式(-b)会依据终端宽度限制进程名的显示长度。在终端直接执行时,top能读取当前终端的COLUMNS环境变量,用合适宽度显示完整进程名;但通过Go的os/exec执行时,默认不会传递终端相关环境变量,top会使用默认窄宽度(通常为80列),导致长进程名被截断并添加+后缀。
解决方案
方案1:手动设置COLUMNS环境变量
创建exec.Cmd时,添加足够大的COLUMNS环境变量,让top知晓输出宽度足够容纳完整进程名:
cmd := exec.Command("top", "-b", "-n", "1") // 设置COLUMNS为200,可根据实际需求调整更大值 cmd.Env = append(os.Environ(), "COLUMNS=200") out, err := cmd.Output() if err != nil { fmt.Println("Error in running command ", err) } fmt.Println(string(out))
方案2:结合top的-c参数显示完整命令行
-c参数会让top显示完整命令行(含进程完整路径与参数),搭配批处理模式可获取更全面的进程信息:
cmd := exec.Command("top", "-b", "-n", "1", "-c") // 建议同时设置COLUMNS避免输出截断 cmd.Env = append(os.Environ(), "COLUMNS=200") out, err := cmd.Output() if err != nil { fmt.Println("Error in running command ", err) } fmt.Println(string(out))
验证效果
修改后运行Go程序,进程名将不再被截断,会显示完整名称(如kworker/u1:1-writeback),与终端直接执行的结果一致。
内容的提问来源于stack exchange,提问作者Shivam Saxena
相关产品推荐
相关产品推荐

