是否有可能更改正在运行的进程的cm​​dline(例如,更容易识别它在顶部)?

我使用VMware Server 2运行许多Linux服务器。当他们的响应时间不是太热或负载平均值上升时,我打开top看看发生了什么,或者我们整天都在开放的生产服务器。 问题是, vmware-vmx进程的cm​​dline 非常长,例如:

 /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 

所以我看到的是:

  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中,每个虚拟机都以自己的用户身份运行,所以我可以很容易地知道哪一个是哪个虚拟机。 对于VMWare Server 2来说并不是这样。代替购买真正的宽屏显示器或三显示器设置,是否有任何方法可以改变这些正在运行的进程的cm​​dline,以便我可以轻松识别哪个是哪个? 我知道进程可以改变自己的cmdline …我可以读取(但不能写入) /proc/nnn/cmdline

有什么方法(作为根)来改变正在运行的进程的cm​​dline吗?

以下情况如何:

watch 'ps -eo pid,pcpu,args | grep vmware'

手表每2秒钟运行一次命令。 pcpu是cpu百分比。

这确实是一个令人讨厌的问题。

真正的解决办法是张贴在这里:

http://blog.angulosolido.pt/2012/01/vmware-2-long-process-names-and-top.html

该脚本不漂亮,但它的作品。

简短的回答,我不认为没有重新编译内核是可能的。 我已经检查了顶部,这绝对是从/ proc拉:
strace top -c 2>&1 | grep "proc"
open("/proc/6501/stat", O_RDONLY) = 4
open("/proc/6501/statm", O_RDONLY) = 4
open("/proc/6501/cmdline", O_RDONLY) = 4

正如你所说,/ proc / pid / cmdline不能被root用户写入。 你有没有考虑用包装程序运行它们? 例如。 bash脚本./vmware只是执行
/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 $1"

值得注意的是,顶部只在空间不足时截断。 为什么不打开顶部,打f和删除任何你不使用的领域。 你可能会发现它为整个cmdline留下了足够的空间

虽然可能没有人会再使用VMWare服务器,但是其他进程也会出现这个问题。 你真的应该看看htop ,它允许横向滚动来读取整个命令行并显示进程树:

http://htop.sourceforge.net/htop-1.0-screenshot.png

至于你的问题,改变一个runnnig进程的命令行可能只能通过覆盖其ARGV [0]的内存地址的数据。 据我所知,目前还没有工具可以使用changecmdline 4652 "foo process" 。 进一步讨论: http : //stupefydeveloper.blogspot.de/2008/10/linux-change-process-name.html

不是你的问题的直接答案,但也许是你的问题的答案:

  1. 使用LSOF来找出哪个PID正在使用哪个VMDK
  2. 使用ps和grep来处理这些PID

这可以很容易地编写脚本,我没有现在打开的Linux控制台。 锻炼留给读者。

 #!/bin/bash DELAY=2 DIRNAME=virtual while true; do clear; ps -eo pid,pcpu,args | grep vmx|grep $DIRNAME |awk '{ print $1 " " $2 " " $NF}'| sort -rn -k 2; sleep $DELAY; done 

尝试这个:

 #!/bin/sh A=`ps -e -o pid,cmd| grep vmware-vmx | grep -v match | awk 'BEGIN {print "{" } {gsub(/^.*\//, "", $NF); print "if (match($0, / *" $1 " /)) { sub(\"vmware-vmx \",\"" "%-20s" "\",$0); printf($0,\"" $NF "\"); print \"\";} else "} END {print "print $0 }"}'` top | awk "$A" 

该脚本用作TOP输出的filter,并用VM名称replace“vmware-vmx”。 它假定.vmx文件不超过20个字符。 这是因为你必须保留由top生成的行大小。