Como identificar o caminho do executável com seu PID no AIX 5 ou mais

6

No AIX 5 ou 6, 'ps -ef' mostra o caminho completo do executável aleatoriamente. Por quê? E como determinar isso?

Encontrei muitos tópicos na Internet e também no Unix & Linux e esta postagem de estouro de pilha sobre como encontrar o caminho de um processo e até agora não consegui aplicar nenhum método.
Eu continuo caindo em ter proftpd mostrado em vez de ter um caminho. Eu finalmente li o man ps do AIX e descubro:

CMD

(-f, -l, and l flags) Contains the command name. Under the -f flag, ps tries to determine the current command name and arguments both of which may be changed asynchronously by the process. These are then displayed. Failing this, the command name as it would appear without the option -f, is written in square brackets.

Eu quero ter certeza de entender o que significa quando eu tenho a seguinte saída:

 ps -ef (truncate output)
root 44900     1   0 11:49:36      -  0:00 proftpd: (accepting connections)
nobody 31986 14976   0   13 feb      -  0:00 /usr/local/apache/bin/httpd -f /usr/local/apache/conf/httpd.conf

Para o daemon httpd , ele mostra o caminho completo, mas não mostra o caminho completo para proftpd . A primeira questão é por que alguns processos são mostrados com o caminho completo e outros não são?

A segunda pergunta é para esse caso:

Posso supor que o caminho do proftpd seja o primeiro que vou encontrar digitando whereis as root ?

No meu caso:

 whereis proftpd
 proftpd: /etc/proftpd.conf /usr/sbin/proftpd  

Então eu suponho que o deamon em execução é /usr/sbin/protfpd ? Estou correto?

Editar 2 :

Deixe-me responder essa parte: NÃO Eu não posso fazer tal suposição - não é relevante de forma alguma. Eu finalmente descobri que o daemon estava rodando a partir de /opt/proftpd , que nem está no caminho da raiz.

O "por que ps -ef funciona dessa maneira" ainda é para determinar, e também: existe alguma outra maneira de descobrir qual é o caminho real que conhece o PID?

Editar 1 : Aqui está a prova de que meu sistema AIX não está suportando exe link em /proc/<PID> .
Eu testo isso no AIX versões 5.3.9.0 e 6.1.7.15:

ls -al /proc/44900/*
-rw-------    1 root     nobody            0 14 jan 09:42 /proc/44900/as
-r--------    1 root     nobody          128 14 jan 09:42 /proc/44900/cred
--w-------    1 root     nobody            0 14 jan 09:42 /proc/44900/ctl
lr-x------   53 root     nobody            0 13 jan 16:07 /proc/44900/cwd -> /
-r--------    1 root     nobody            0 14 jan 09:42 /proc/44900/map
-r--r--r--    1 root     nobody          448 14 jan 09:42 /proc/44900/psinfo
-r--------    1 root     nobody         1024 14 jan 09:42 /proc/44900/sigact
-r--------    1 root     nobody         1520 14 jan 09:42 /proc/44900/status
-r--r--r--    1 root     nobody            0 14 jan 09:42 /proc/44900/sysent

/proc/44900/fd:
total 5483376
dr-x------    1 root     nobody            0 14 jan 09:42 .
dr-xr-xr-x    1 root     nobody            0 14 jan 09:42 ..
-r--r--r--    1 root     nobody         5005 12 jul 2004  3
-r--r--r--    1 root     nobody         8655 13 nov 15:13 5
-r--r--r--    1 root     nobody         1607 13 nov 15:12 6
--w-------    1 root     nobody   2378419349 13 jan 16:06 7
--w-------    1 root     nobody    423405131 13 jan 16:06 8

/proc/44900/lwp:
total 0
dr-xr-xr-x    1 root     nobody            0 14 jan 09:42 .
dr-xr-xr-x    1 root     nobody            0 14 jan 09:42 ..
dr-xr-xr-x    1 root     nobody            0 14 jan 09:42 99075

/proc/44900/object:
total 90312
dr-x------    1 root     nobody            0 14 jan 09:42 .
dr-xr-xr-x    1 root     nobody            0 14 jan 09:42 ..
-rwxr-xr-x    1 root     system      1268973 16 okt 2012  a.out
-rwxr-xr-x    1 bin      bin           15265 12 jul 2004  jfs.10.5.12513
-r--r--r--    1 bin      bin         8587637 23 mei 2008  jfs.10.5.16405
-r-xr-xr-x    1 bin      bin         9281793 23 sep 2008  jfs.10.5.4131
-r-xr-xr-x    1 bin      bin           11019 01 okt 2007  jfs.10.5.4149
-r--r--r--    1 bin      bin          162078 19 jun 2008  jfs.10.5.4169
-r--r--r--    1 bin      bin         1161414 23 sep 2008  jfs.10.5.4171
-r--r--r--    1 bin      bin          379513 19 jun 2008  jfs.10.5.4943
-r-xr-xr-x    1 bin      bin           96495 19 jun 2008  jfs.10.5.5248
-rw-r--r--    1 root     system     17160842 05 okt 2011  jfs2.51.3.266241
-rwxr-xr-x    1 root     system       315783 11 mei 2006  jfs2.51.3.266246
-rw-r--r--    1 root     system      3237612 05 okt 2011  jfs2.51.3.266262
-rw-r--r--    1 root     system       125958 25 mrt 2008  jfs2.51.3.270769
-rwxr-xr-x    1 root     system      3140221 20 mei 2011  jfs2.51.3.282757
-rwxr-xr-x    1 root     system      1268973 16 okt 2012  jfs2.51.3.283899

Nenhum link simbólico.

    
por Kiwy 13.01.2014 / 17:22

2 respostas

4

Ok, então aqui estão minhas respostas para minhas perguntas.

  • Primeiro: Posso supor que o caminho do proftpd é o primeiro que vou encontrar digitando whereis como root?
    == > NÃO, pelo menos com a minha experiência, não mostra informações confiáveis para determinar o caminho do executável do processo.

  • Segundo: Como determinar o caminho do executável de um processo em execução?
    Eu encontrei um tópico do stackoverflow que indica essa possibilidade, que é até agora a única que me mostrou a resposta correta:
    svmon -P <PID> -O format=nolimit,filename=on,filtertype=client
    O problema com este comando é que você tem que esperar até que ele mostre a informação que você quer, mas provavelmente lhe dará a resposta depois de um tempo. Outro problema é que esse método não pode ser usado em um script.

  • Terceiro: Sobre o "Por que ps -ef não está mostrando nenhum caminho completo nem relativo"
    A resposta é provavelmente (mas fique à vontade para me corrigir ) que mostra o comando real digitado pelo usuário, então se root estava em uma pasta contendo proftpd , ele mostrará apenas proftpd
    Não faço ideia até agora.

Essa é até agora a melhor resposta que eu posso dar.

Editar 1 :

Maneira gravável de encontrar o caminho de um executável em execução (esse método não vem de mim, mas de esta postagem no fórum ). Observe que não fornecerei um script porque está muito além das minhas capacidades e não tenho tempo agora.

  • O primeiro passo é obter o inode do seu binário executável

    ls -i /proc/<PID>/object/a.out  |  cut -f 1 -d " "
    

    Este comando produzirá um número.

  • Em seguida, você precisa identificar o dispositivo no qual seu arquivo é para dar uma olhada nesse comando:

    ls -li /proc/<PID>/object/ | egrep "<inode>$"
    

    Este comando fornece um nome de arquivo como este: jfs2.51.3.<inode> . jfs2 é o tipo de sistema de arquivos, 51 do número principal do dispositivo e 3 do número menor do dispositivo.

  • Depois de identificar as informações do dispositivo, precisamos identificar o dispositivo de bloco no qual o arquivo está localizado, com o seguinte comando:

    ls -l /dev/ | egrep "^b.*51, *3.+$"  
    

    ^b.*51, *3.+$ ^b é usado para corresponder ao dispositivo de bloqueio
    51, *3 corresponde ao bloco principal 51 seguido por uma vírgula e qualquer espaço e número de bloco menor 3 localizar anteriormente.
    Este comando fornece algo como: brw-rw---- 1 root system 51, 3 24 feb 2009 myfilesystem

  • Você pode identificar o ponto de montagem do seu bloco assim:

    df | grep myfilesystem
    /dev/myfilesystem     31457280    144544  100%   107442    81% /opts
    
  • Agora você sabe onde precisa pesquisar seu número:

    find /opts -inum <inode>
    

Admito que este método é um pouco complicado, mas é o único que até agora descobri que é "facilmente programável". Se alguém escrever um roteiro, ficaria feliz em lê-lo.

    
por 14.01.2014 / 11:10
2
getPathByPid()
{
    if [[ -e /proc/$1/object/a.out ]]; then
        inode='ls -i /proc/$1/object/a.out 2>/dev/null | awk '{print $1}''
        if [[ $? -eq 0 ]]; then
            strnode=${inode}"$"
            strNum='ls -li /proc/$1/object/ 2>/dev/null | grep $strnode | awk '{print $NF}' | grep "[0-9]\{1,\}\.[0-9]\{1,\}\."'
            if [[ $? -eq 0 ]]; then
                # jfs2.10.6.5869
                n1='echo $strNum|awk -F"." '{print $2}''
                n2='echo $strNum|awk -F"." '{print $3}''
                # brw-rw----    1 root     system       10,  6 Aug 23 2013  hd9var
                strexp="^b.*"$n1,"[[:space:]]\{1,\}"$n2"[[:space:]]\{1,\}.*$"   # "^b.*10, \{1,\}5 \{1,\}.*$"
                strdf='ls -l /dev/ | grep $strexp | awk '{print $NF}''
                if [[ $? -eq 0 ]]; then
                    strMpath='df | grep $strdf | awk '{print $NF}''
                    if [[ $? -eq 0 ]]; then
                        find $strMpath -inum $inode 2>/dev/null
                        if [[ $? -eq 0 ]]; then
                            return 0
                        fi
                    fi
                fi
            fi
        fi
    fi
    return 1
}
    
por 11.08.2015 / 07:11

Tags