背景
一客户反映,通过控制台启动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
通过查看Cmd的Start方法,由于在之前给Cmd的Stdout、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,客户修改脚本后问题解决