Questão Como detectar de onde o aplicativo foi iniciado?


Quando eu digito um nome de algum executável na linha de comando e ele inicia, como posso detectar o caminho onde esse executável está localizado?


1


origem


Eu acho que sua pergunta está respondida aqui já: serverfault.com/questions/232762/… - obeliksz


Respostas:


Você pode descobrir qual executável será iniciado usando o comando

which <command>

Se você quiser determinar o caminho programaticamente, estará na troca de pilha errada.


3



Se você passar opção -a, todos possíveis correspondências são exibidas. E há também whereis que procura por manuais e fontes também. - scai


O problema da solução simples

whichcommand encontra o arquivo executável do dado command na tua $PATH. Infelizmente isso não funcionará como esperado em todos os casos.

Quando command é um alias ou uma função, você não obterá um resultado correto porque o executável real que está sendo executado pode ter um nome completamente diferente. Por exemplo, muitas distribuições Linux têm o ll alias definido por padrão. which ll não encontra nada. Outro caso problemático é quando o seu shell se comporta de maneira não padrão e não executa o primeiro command encontrado no $PATH.

A solução mais confiável

No Linux, se você quiser ter certeza do caminho do arquivo executável de um processo em execução, pode obtê-lo PID (ID do processo; no exemplo abaixo, coloque o número em vez de $PID):

readlink /proc/$PID/exe

Como obter o número? PID do último processo executado em shell no fundo é $!. Pequena demonstração:

sleep 20 &
readlink /proc/$!/exe

Você pode ter PIDs de outros processos, por exemplo, de uma lista de processos usando ps -ef.

Explicação: /proc/$PID/exe é um link simbólico para o arquivo executável do corrida processo. O comando readlink mostra o alvo para o qual o link simbólico está apontando.

Scripts são um caso especial

Infelizmente, o readlink /proc/$PID/exe método não funciona como esperado com linguagens de script como bash, Perl, Python, etc. Nesses casos, você obterá o caminho para o interpretador do script (como /bin/bash) em vez do caminho para o script. Para se aproximar das informações que você pode usar:

cat /proc/$PID/cmdline     # the commandline with the interpreter and script
readlink /proc/$PID/cwd    # the current working directory

Infelizmente, o diretório de trabalho atual pode mudar desde o início do programa. Alguns intérpretes como o bash podem manter o arquivo de script aberto no descritor 255:

readlink /proc/$PID/fd/255

Tudo pode mudar

Qualquer processo pode ligar exec() que substitui seu /proc/$PID/exe, /proc/$PID/cmdline e outras informações.


3