我使用 VMware Server 2 运行了许多 Linux 服务器。当它们的响应时间不太好或平均负载上升时,我会打开它top
来查看发生了什么,或者对于我们的生产服务器,我top
整天都在打开它。问题是,vmware-vmx
进程的命令行是真的长,例如:
/usr/lib/vmware/bin/vmware-vmx -# product=2;name=VMware Server;version=2.0.2;buildnumber=203138;licensename=VMware GSX Server for Linux;licenseversion=3.0 build-203138; -@ pipe=/tmp/vmhsdaemon-0/vmxaf9a31943e9065f0;readyEvent=55 /var/lib/vmware/Virtual Machines/Kyle.vmwarevm/Kyle.vmx
所以top
我所看到的是:
4135 root 20 0 593m 324m 289m S 21 4.2 3038:04 /usr/lib/vmware/bin/vmware-vmx -# product=2;name=VMware Server;
4106 root 10 -10 997m 399m 346m S 9 5.1 1135:25 /usr/lib/vmware/bin/vmware-vmx -# product=2;name=VMware Server;
4074 root 20 0 833m 110m 97m S 2 1.4 722:19.38 /usr/lib/vmware/bin/vmware-vmx -# product=2;name=VMware Server;
在 VMWare Server 1 中,每个 VM 都以自己的用户身份运行,因此我可以轻松分辨出哪个是哪个。但在 VMWare Server 2 中则并非如此。除了购买非常宽的显示器或三重显示器设置外,我是否可以通过任何方式更改这些正在运行的进程的命令行,以便轻松识别哪个是哪个?我知道进程可以更改自身的命令行……我可以读取(但不能写入)/proc/nnn/cmdline
……
有没有什么办法(以 root 身份)可以改变正在运行的进程的命令行?
答案1
虽然可能没有人会再使用 VMWare Server,但这个问题也会出现在其他进程中。你真的应该看着顶部相反,它允许侧滚动读取整个命令行并显示进程树:
至于您的问题,更改已在运行的进程的命令行可能只有通过覆盖其 ARGV[0] 内存地址处的数据才有可能。据我所知,目前还没有可用的工具可以做到这一点changecmdline 4652 "foo process"
。进一步讨论:http://stupefydeveloper.blogspot.de/2008/10/linux-change-process-name.html
答案2
那么以下内容如何:
watch 'ps -eo pid,pcpu,args | grep vmware'
Watch 将每 2 秒运行一次命令。pcpu
是 CPU 百分比。
答案3
这确实是个让人恼火的问题。
真正的解决方案发布在这里:
http://blog.angulosolido.pt/2012/01/vmware-2-long-process-names-and-top.html
脚本并不漂亮,但是它有效。
答案4
这不是对您的问题的直接回答,但也许是对您的问题的回答:
- 使用 LSOF 找出哪些 PID 正在使用哪些 VMDK
- 使用 ps 和 grep 查找这些 PID
这可以很容易地编写脚本,但我现在没有打开 Linux 控制台。练习留给读者。