gops用来查看系统中存在的go进程。
注意事项:
gops有可能没发现你的go进程:
一方面可能进程是藏在容器中的,在宿主机上gops就发现不了
另一种情况,就是gops参考的是进程文件的特征,该特征在不同go版本可能不一样,比如,我的gops能发现go 1.11的go进程,就发现不了go 1.14的go进程
如下:
gops能list出来系统中的go进程,如果内置了agent的话,还能添加个星号,带星号的进程可以进行深度的分析(因为有agent呀)
那么,gops是如何找到所有go进程,又是如何识别出来agent的呢?
关键代码是这么写的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
// isGo looks up the runtime.buildVersion symbol // in the process' binary and determines if the process // if a Go process or not. If the process is a Go process, // it reports PID, binary name and full path of the binary. func isGo(pr ps.Process) (path, version string, agent, ok bool, err error) { if pr.Pid() == 0 { // ignore system process return } path, err = pr.Path() if err != nil { return } var versionInfo goversion.Version versionInfo, err = goversion.ReadExe(path) if err != nil { return } ok = true version = versionInfo.Release pidfile, err := internal.PIDFile(pr.Pid()) if err == nil { _, err := os.Stat(pidfile) agent = err == nil } return path, version, agent, ok, nil } |
- 拿到所有的系统进程
- 分析进程文件可以检测是否go进程
- 在进程的用户目录下查找 .config/gops/{$pid} 文件,如果存在,就认为是有内置了agent了,该文件中存放的是agentlisten的端口号
如下: