Linux: Como saber onde um processo foi iniciado e como foi iniciado?

28

Eu estava verificando uma caixa de Linux e encontrei um processo perl em execução e tendo uma boa parte do uso da CPU. Com top, eu só poderia perl no nome do processo.

Quando eu pressionei c , para ver a linha de comando, ele mostrou / var / spool / mail. O que não faz sentido, já que este é o diretório.

Minhas perguntas são:

1) Por que isso aconteceu? Como este processo perl poderia mascarar sua linha de comando? 2) Qual é a maneira mais confiável de descobrir onde e como um processo foi iniciado?

Obrigado!

    
por Fernando 08.02.2011 / 17:18

7 respostas

31

Na maioria dos casos, apenas a execução de ps é geralmente suficiente, junto com suas sinalizações favoritas para permitir uma saída ampla. Eu me inclino para ps -feww , mas as outras sugestões aqui funcionarão. Observe que, se um programa foi iniciado com $PATH de alguém, você só verá o nome do executável, não o caminho completo. Por exemplo, tente isto:

$ lftp &
$ ps -feww | grep ftp
lars      9600  9504  0 11:30 pts/10   00:00:00 lftp
lars      9620  9504  0 11:31 pts/10   00:00:00 grep ftp

É importante observar que as informações visíveis em ps podem ser completamente sobrescritas pelo programa em execução. Por exemplo, este código:

int main (int argc, char **argv) {
        memset(argv[0], ' ', strlen(argv[0]));
        strcpy(argv[0], "foobar");
        sleep(30);
        return(0);
}

Se eu compilar isso em um arquivo chamado "myprogram" e executá-lo:

$ gcc -o myprogram myprogram.c
$ ./myprogram &
[1] 10201

E, em seguida, executar ps , veremos um nome de processo diferente:

$ ps -f -p 10201
UID        PID  PPID  C STIME TTY          TIME CMD
lars     10201  9734  0 11:37 pts/10   00:00:00 foobar

Você também pode olhar diretamente para /proc/<pid>/exe , que pode ser um link simbólico para o executável apropriado. No exemplo acima, isso fornece informações muito mais úteis do que ps :

$ls -l /proc/9600/exe
lrwxrwxrwx. 1 lars lars 0 Feb  8 11:31 /proc/9600/exe -> /usr/bin/lftp
    
por 08.02.2011 / 17:32
43

A maneira mais confiável é examinar o /proc dir do processo. Cada processo tem um diretório /proc/<pid>/ , onde mantém informações como:

  1. cwd link para o diretório de trabalho atual
  2. fd a dir com links para os arquivos abertos (descritores de arquivos)
  3. cmdline leu para ver qual linha de comando foi usada para iniciar o processo
  4. environ as variáveis de ambiente para esse processo
  5. root um link para o que o processo considera seu diretório raiz (ele será / a menos que seja chrooted)

Há mais informações interessantes sobre cada processo / proc, mas, com as informações acima, você poderá saber exatamente o que está acontecendo.

Além disso, usar ps auxf mostrará a você quem bifurcou para que você possa ter uma ideia melhor de quem está chamando seu perl.

    
por 09.02.2011 / 13:51
6

para mim, só agora, achei que pstree deu uma indicação muito mais clara de como um processo foi iniciado, do que ps aux

parece com isso:

  ├─lightdm─┬─Xorg
  │         ├─lightdm─┬─init─┬─apache2───2*[apache2───26*[{apache2}]]
  │         │         │      ├─at-spi-bus-laun─┬─dbus-daemon
  │         │         │      │                 └─3*[{at-spi-bus-laun}]
  │         │         │      ├─at-spi2-registr───{at-spi2-registr}
  │         │         │      ├─dbus-daemon
  │         │         │      ├─dropbox───29*[{dropbox} ]
    
por 21.08.2016 / 14:07
1

Teste ps axww | grep perl para obter a linha de comando completa do seu processo. Parece que top apenas recortou uma linha longa.

    
por 08.02.2011 / 17:25
1

Tente usar o comando %código% Este comando exibirá os PIDs dos processos usando os arquivos ou sistemas de arquivos especificados. No modo de exibição padrão, cada nome de arquivo é seguido por uma letra que indica o tipo de acesso:

c - diretório atual. e - executável sendo executado. f - abrir arquivo. f é omitido no modo de exibição padrão. r - diretório raiz. m - arquivo mmap'ed ou biblioteca compartilhada.

Talvez isso ajude você a seguir em frente com a pesquisa que você está procurando. Eu não sei se isso te ajuda, mas talvez você descubra alguma informação útil.

    
por 08.02.2011 / 20:15
0

Sem consultar a página de manual para as bandeiras exatas, uma maneira fácil de financiar a linha de comando e a hora de início, ps auxwww Deveria trabalhar. Você pode torná-lo mais elegante, se desejado, lendo a página do manual.

    
por 08.02.2011 / 17:26
0

Dois comandos vêm à mente:

1) obtenha a hora de início do processo de ' ps '.

$ ps -ax -o pid,start,comm
  PID  STARTED COMMAND         USER
    1   Feb 06 init            root
    2   Feb 06 kthreadd        root
[...]
  13147 19:09:48 chrome          hcooper
  13270 19:13:51 chrome          hcooper
  13386 19:18:34 bash            hcooper

2) lastcomm , que agora eu verifico, não tenho instalado. De qualquer forma, a descrição da página man diz:

   lastcomm prints out information about previously executed commands. If
   no arguments are specified, lastcomm will print info about all of the
   commands in acct (the record file).

Mas, como algumas pessoas disseram, "ls -al / proc /" vai lhe dizer muito!

    
por 08.02.2011 / 20:38