Como sobre o seguinte:
watch 'ps -eo pid,pcpu,args | grep vmware'
O relógio executará o comando a cada 2 segundos. pcpu
é a porcentagem da CPU.
Eu executei vários servidores Linux com o VMware Server 2. Quando o tempo de resposta não está tão alto ou a média de carga sobe, eu abro top
para ver o que está acontecendo, ou para os nossos servidores de produção eu tenho top
aberto o dia todo. O problema é que o cmdline de vmware-vmx
processes é realmente longo, por exemplo:
/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
Então, em top
, tudo que vejo é:
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;
No VMWare Server 1, cada VM seria executada como seu próprio usuário, para que eu pudesse identificar com facilidade qual delas era qual. Não é assim com o VMWare Server 2. Em vez de comprar um monitor realmente grande ou uma configuração de monitor triplo, existe alguma maneira de alterar o cmdline desses processos em execução para que eu possa identificar facilmente qual deles é o que? Eu sei que os processos podem alterar o cmdline deles mesmos ... e eu posso ler (mas não escrever para) /proc/nnn/cmdline
...
Existe alguma maneira (como root) de alterar o cmdline de um processo em execução?
Como sobre o seguinte:
watch 'ps -eo pid,pcpu,args | grep vmware'
O relógio executará o comando a cada 2 segundos. pcpu
é a porcentagem da CPU.
Este é realmente um problema chato.
A solução real é publicada aqui:
O script NÃO é bonito, mas funciona.
Embora, provavelmente, ninguém mais use o VMWare Server, esse problema também surgiria com outros processos. Você realmente deve olhar htop ao invés disso, ele permite que a rolagem lateral leia toda a linha de comando e exiba árvores de processo:
Quantoàsuapergunta,alteraralinhadecomandodeumprocessoquejáérunnnigprovavelmentesóserápossívelsobrescrevendodadosnoendereçodememóriadeseuARGV[0].Queeusaiba,nenhumaferramentaaindaestádisponível,oqueapenasfariachangecmdline4652"foo process"
. Discussão adicional: link
Resposta curta, não acho que seja possível sem recompilar o kernel. Eu verifiquei o topo e ele está definitivamente puxando de / 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
Como você disse, / proc / pid / cmdline não é gravável pelo root. Você já pensou em executá-los com um programa de wrapper? por exemplo. bash script ./vmware que apenas executa o /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"
É importante notar que o topo apenas trunca quando está sem espaço. Por que não abrir o topo, aperte f e remova todos os campos que você não está usando. Você pode achar que ele deixa espaço suficiente para todo o cmdline
Não é uma resposta direta à sua pergunta, mas talvez uma resposta para o seu problema:
Isso pode ser facilmente roteirizado, mas não tenho um console Linux aberto agora. Exercício deixado para o leitor.
#!/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
Tente isto:
#!/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"
O script funciona como um filtro para a saída TOP e substitui "vmware-vmx" pelo nome da VM. Ele assume que o arquivo .vmx não é mais do que 20 caracteres. Isso porque você precisa preservar o tamanho da linha gerada pelo topo.