记录排查exec.Cmd执行卡住的过程

背景

一客户反映,通过控制台启动hiveserver2一直卡住,但是在机器上查看进程已经启动

排查过程

在客户的机器上,会启动一个agent,用来从server端获取指令并执行,通过查看agent的日志,的确是只有执行的日志,没有返回结果的日志,通过走读golang的代码,很有可能是执行指令的协程中某个chan没有返回卡住了

1. 获取agent的goroutine

wget http://localhost:8666/debug/pprof/goroutine
wget http://localhost:8666/debug/pprof/goroutine?debug=2 -O goroutine2

第一个wget用来通过 go tool pprof来进行分析,第二个就是文本,可以查看每个routine的堆栈与执行时间。先看下协程的调用链的图

image.png

果然有指令执行阻塞了
企业微信截图_de75c6d8-af3c-4e50-bdee-44689b497841.png

通过vim查看goroutine2,根据运行时间推算的确是阻塞的指令
企业微信截图_eeca773b-57e7-451b-adc7-9a7adc954ae8.png

通过查看CmdStart方法,由于在之前给CmdStdout、Stderr赋值了,会初始化一个Pipe(管道),一头连agent,一头会去连接子进程

企业微信截图_87c9900c-6992-4f45-b0d8-8a84bd044775.png

agent会从pr读数据,pw会给到子进程去写数据。

企业微信截图_bdb37179-6024-4014-8d82-027e50c1814d.png

当pipe关闭时,该errch就会返回,现在看是pipe没有关闭
企业微信截图_68a017e9-8df4-418f-98f0-0d773ed5eafa.png

inode为94176617的pipe果然没有关闭,查看客户启动hiveserver2的脚本
企业微信截图_f767523d-e822-44d6-a89d-34826a19a43c.png

查看正常启动hiveserver2的脚本
企业微信截图_6a7fc099-4840-47e3-8842-52323de17fb7.png

少了个> /dev/null,客户修改脚本后问题解决

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容