Como detectar de onde o aplicativo foi iniciado?

1

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?

    
por user626528 03.07.2013 / 09:42

2 respostas

3

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.

    
por 03.07.2013 / 09:45
3

O problema da solução simples

which command localiza o arquivo executável de command em $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 em execução pode ter um nome completamente diferente. Por exemplo, muitas distribuições do Linux têm o ll alias definido por padrão. which ll não encontra nada. Outro caso problemático é quando 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ê quer ter certeza absoluta do caminho do arquivo executável de um processo em execução, então você pode obtê-lo de seu PID (ID do processo; no exemplo abaixo, coloque o número de $PID ):

readlink /proc/$PID/exe

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

sleep 20 &
readlink /proc/$!/exe

Você pode obter 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 processo em execução . O comando readlink mostra o alvo para o qual o link simbólico está apontando.

Scripts são um caso especial

Infelizmente, o método readlink /proc/$PID/exe 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 roteiro. 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 chamar exec() , que substitui suas /proc/$PID/exe , /proc/$PID/cmdline e outras informações.

    
por 03.07.2013 / 20:37

Tags