检查进程是否为 Go 应用程序(Linux/Unix)

Check if a process is a Go application (in Linux/Unix)

我正在使用 ps(特别是 psutil python 库)在我的 linux 机器上查看 运行 个进程的列表。我想确定哪些进程是 运行 Go 应用程序(也就是说,它们是 运行 Go 代码)。

下面是用 Go 编写的进程的 ps 输出。有什么表明是运行 Go代码吗?

{'cmdline': ['./SampleMePlz'],
 'connections': [connection(fd=3, family=10, type=1, laddr=('::', 8080), raddr=(), status='LISTEN')],
 'cpu_affinity': [0, 1, 2, 3],
 'cpu_percent': 0.0,
 'cpu_times': cputimes(user=0.0, system=0.0),
 'create_time': 1436474176.89,
 'cwd': '/home/ben/gocode/src/SampleMePlz',
 'exe': '/home/ben/gocode/src/SampleMePlz/SampleMePlz',
 'ext_memory_info': meminfo(rss=4071424, vms=192684032, shared=3092480, text=3096576, lib=0, data=179523584, dirty=0),
 'gids': group(real=5000, effective=5000, saved=5000),
 'io_counters': io(read_count=12, write_count=0, read_bytes=4096, write_bytes=0),
 'ionice': ionice(ioclass=0, value=4),
 'memory_info': meminfo(rss=4071424, vms=192684032),
 'memory_maps': [mmap(path='/lib/x86_64-linux-gnu/libpthread-2.15.so', rss=65536, size=2199552, pss=8192, shared_clean=57344, shared_dirty=0, private_clean=0, private_dirty=8192, referenced=65536, anonymous=8192, swap=0),
                 mmap(path='/lib/x86_64-linux-gnu/libc-2.15.so', rss=311296, size=3903488, pss=26624, shared_clean=286720, shared_dirty=0, private_clean=0, private_dirty=24576, referenced=311296, anonymous=24576, swap=0),
                 mmap(path='[stack]', rss=8192, size=139264, pss=8192, shared_clean=0, shared_dirty=0, private_clean=0, private_dirty=8192, referenced=8192, anonymous=8192, swap=0),
                 mmap(path='[anon]', rss=946176, size=179245056, pss=946176, shared_clean=0, shared_dirty=0, private_clean=0, private_dirty=946176, referenced=946176, anonymous=946176, swap=0),
                 mmap(path='/lib/x86_64-linux-gnu/ld-2.15.so', rss=122880, size=151552, pss=13312, shared_clean=110592, shared_dirty=0, private_clean=0, private_dirty=12288, referenced=122880, anonymous=12288, swap=0),
                 mmap(path='[vsyscall]', rss=0, size=4096, pss=0, shared_clean=0, shared_dirty=0, private_clean=0, private_dirty=0, referenced=0, anonymous=0, swap=0),
                 mmap(path='[heap]', rss=4096, size=135168, pss=4096, shared_clean=0, shared_dirty=0, private_clean=0, private_dirty=4096, referenced=4096, anonymous=4096, swap=0),
                 mmap(path='[vdso]', rss=4096, size=4096, pss=0, shared_clean=4096, shared_dirty=0, private_clean=0, private_dirty=0, referenced=4096, anonymous=0, swap=0),
                 mmap(path='/home/ben/gocode/src/SampleMePlz/SampleMePlz', rss=2908160, size=6905856, pss=2908160, shared_clean=0, shared_dirty=0, private_clean=2879488, private_dirty=28672, referenced=2908160, anonymous=28672, swap=0)],
 'memory_percent': 0.025919821179310142,
 'name': 'SampleMePlz',
 'nice': 0,
 'num_ctx_switches': amount(voluntary=15, involuntary=18),
 'num_fds': 5,
 'num_threads': 6,
 'open_files': [],
 'pid': 111252,
 'ppid': 42061,
 'status': 'sleeping',
 'terminal': '/dev/pts/9',
 'threads': [thread(id=111252, user_time=0.0, system_time=0.0),
             thread(id=111253, user_time=0.0, system_time=0.0),
             thread(id=111254, user_time=0.0, system_time=0.0),
             thread(id=113972, user_time=0.0, system_time=0.0),
             thread(id=113973, user_time=0.0, system_time=0.0),
             thread(id=113974, user_time=0.0, system_time=0.0)],
 'uids': user(real=3008, effective=3008, saved=3008),
 'username': 'ben'}

简短的回答是否定的。编译代码时没有留下任何有关 language/compiler 生成它的信息。您可以查找 go-program 的症状,例如对您的 GOPATH 或其子目录的引用,但仅此而已。

除了@evanmcdonnal 的回答之外,还有一个(非常非常)hacky 的解决方案:

strings /path/to/binary/from/ps/output | grep 'runtime.gogc' 

输出:

<snip>
runtime.gogc                                                                                            runtime.gogc   
runtime.gogc   
<snip>

这当然依赖于二进制格式不改变或以其他方式被混淆,这不是一个长期的好假设。我还假设 runtime.gogc 存在于所有 Go 二进制文件中(可能不存在)。

请注意,从操作的角度来看,非常很少有这样的有用信息。