Como usar os comandos 'top' e 'USER' juntos

1

Eu tenho um requisito para filtrar os resultados do processo com o contexto do usuário. Eu estou usando o comando like.

# top -b -n 1 -p $(pgrep -d',' http)
top - 14:44:13 up 7 days,  3:01,  6 users,  load average: 0.05, 0.01, 0.00
Tasks:   3 total,   0 running,   3 sleeping,   0 stopped,   0 zombie
Cpu(s):  1.0%us,  1.4%sy,  0.0%ni, 97.4%id,  0.1%wa,  0.0%hi,  0.1%si,  0.0%st
Mem:   8062112k total,  4471344k used,  3590768k free,   176040k buffers
Swap:  6160376k total,       88k used,  6160288k free,   797580k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND            
27720 root      20   0  175m 3708 1408 S  0.0  0.0   0:05.79 httpd              
27722 daemon    20   0  175m 3076  708 S  0.0  0.0   0:00.00 httpd              
27723 daemon    20   0 2417m 176m  13m S  0.0  2.2   0:43.19 httpd  

E eu quero obter o 'id do processo' que está sob o contexto do usuário 'root'.

    
por kgopi 01.04.2013 / 11:23

3 respostas

1

pgrep também suporta filtragem pelo usuário do processo:

pgrep -u root httpd

Se você quiser extrair o PID da sua saída top , tente este awk one-liner:

($NF=="httpd" && $2=="root") {print $1}

por exemplo.

top -b -n 1 -p $(pgrep -d',' http) | 
  gawk '($NF=="httpd" && $2=="root") {print $1}'

Outra opção pgrep às vezes útil é -o para o processo de correspondência mais antigo, que deve ser o processo de ouvinte httpd de nível superior (pgrep é inteligente o suficiente para tentar fazer a coisa certa quando os processos correspondentes têm o mesmo "hora de início".

O Apache também é geralmente configurado para gravar um arquivo pid, normalmente em algum lugar como /usr/local/apache2/logs/httpd.pid ou /var/run/httpd.pid , que deve conter o PID de nível superior também (embora seja um pouco menos confiável, pois pode ser obsoleto).

    
por 01.04.2013 / 16:50
0

No Linux, supondo que /proc esteja disponível (se não, você provavelmente terá problemas maiores para obter uma visão completa dos processos em execução), você pode obter os PIDs de todos os processos pertencentes a root usando um comando como o seguinte :

find /proc -maxdepth 1 -type d -regex '^/proc/[1-9][0-9]*$' -uid 0 -print \
| sed 's,/proc/,,g'

Estritamente falando, isso listará todos os diretórios diretamente dentro de / proc que tenham um nome começando com um dígito diferente de zero seguido por qualquer número de dígitos. Em seguida, ele usa sed para remover o /proc/ no início de cada linha de saída, deixando apenas os PIDs numéricos.

A saída disso pode ser transferida para o processo que você quiser; Será simplesmente uma lista de PIDs, um por linha. Por exemplo, você poderia enviar a saída para um loop como while read pid; do something $pid; done para fazer something para cada PID por vez.

No meu sistema, a saída parece ser ordenada numericamente, mas acho que você não pode contar com isso sempre. sort será útil, caso contrário (e dependendo do que você deseja, você pode estar particularmente interessado em algo como sort -rn para uma ordenação numérica reversa).

A parte -uid 0 pode ser substituída para referenciar qualquer UID numérico que você queira (ou veja a página find man para outras possibilidades; por exemplo, -gid ). Se você estiver interessado em seus próprios processos em vez de em root, algo como id -u será útil ( -uid $(id -u) ).

    
por 01.04.2013 / 13:32
0

A melhor ferramenta para isso provavelmente seria ps :

   ps displays information about a selection of the active
   processes.  If you want a repetitive update of the selection
   and the displayed information, use top(1) instead.

As opções relevantes aqui são:

   -C cmdlist
          Select by command name.  This selects the processes
          whose executable name is given in cmdlist.
   -o format
          User-defined format.  format is a single argument in
          the form of a blank-separated or comma-separated list,
          which offers a way to specify individual output
          columns.  The recognized keywords are described in the
          STANDARD FORMAT SPECIFIERS section below. 

Portanto, para encontrar todos os httpd processos que foram iniciados pelo root:

$ ps -C httpd -o pid,user
  PID USER
27720 root
27722 daemon
27723 daemon

Teoricamente. passar a opção -u root para ps deve retornar apenas os processos executados por root , mas isso não funciona no meu sistema, não sei por quê. Então nós analisamos:

$ ps -C httpd -o pid,user | gawk '$2==root{print $1}'
27720
    
por 01.04.2013 / 17:21

Tags