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 seroot
estava em uma pasta contendoproftpd
, ele mostrará apenasproftpd
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 e3
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 principal51
seguido por uma vírgula e qualquer espaço e número de bloco menor3
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.