É possível alterar o cmdline de um processo em execução (para identificá-lo mais facilmente no topo, por exemplo)?

1

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?

    
por Josh 24.09.2010 / 14:59

7 respostas

3

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.

    
por 24.09.2010 / 15:38
3

Este é realmente um problema chato.

A solução real é publicada aqui:

link

O script NÃO é bonito, mas funciona.

    
por 10.01.2012 / 16:27
3

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

    
por 18.07.2012 / 18:10
2

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

    
por 24.09.2010 / 15:39
1

Não é uma resposta direta à sua pergunta, mas talvez uma resposta para o seu problema:

  1. Use o LSOF para descobrir quais PIDs estão usando quais VMDKs
  2. Use ps e grep para esses PIDs

Isso pode ser facilmente roteirizado, mas não tenho um console Linux aberto agora. Exercício deixado para o leitor.

    
por 24.09.2010 / 15:21
1
#!/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
    
por 04.01.2012 / 00:41
1

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.

    
por 11.09.2013 / 21:31