Como encontrar a localização do executável em Linux quando os métodos normais falhar?
Pergunta
Em outra pergunta, os estados de resposta que em Unixes com /proc
, a maneira realmente em linha reta e confiável é readlink("/proc/self/exe", buf, bufsize)
e, em seguida, passa a dar soluções de backup da seguinte forma:
On Unixes sem / proc (ou seja, se acima falhar):
- Se argv [0] começa com "/" (caminho absoluto), este é o caminho.
- Caso contrário, se argv [0] contém "/" (caminho relativo) acrescentá-la à cwd (supondo que ele ainda não foi alterado).
getcwd(buf, bufsize); strncat(buf, "/", bufsize-strlen(buf)-1); strncat(buf, argv[0], bufsize-strlen(buf)-1);
- Caso contrário, procurar diretórios em
$PATH
paraargv[0]
executável.
Depois pode ser razoável para verificar se o executável não é na verdade um link simbólico. Se é resolvê-lo em relação ao diretório link simbólico.
Agora, no meu caso, infelizmente, nenhuma das obras acima:
-
/proc/self/exe exists
mas não conseguemreadlink()
devido à permissão negada errno 13. - O
argv[0]
não tem/
de caminho absoluto ou relativo. - O
$PATH
não contém o Found executável emargv[0]
.
Parece que este problema é enfrentado também quando os aplicativos SGID executado. No meu caso, não é SGID, mas um lançamento inetd.
Solução
Tente olhar em / proc de um binário suid.
Outras dicas
A melhor maneira de resolver isso é no arquivo de configuração /etc/xinetd.d/myApp, para adicionar uma variável de ambiente que especifica a localização do binário da seguinte forma:
service myApp
{
socket_type = stream
protocol = tcp
wait = no
user = root
server = /usr/local/bin/myAppd
env = MY_APP_HOME=/usr/local/bin
port = 2354
disable = no
}
Então, se / proc / self / exe é permissão negada, de seleção para o varible env e usá-lo em seu lugar.
Eu acho que a resposta é: desista ??p>.
Peça ao usuário para passar o diretório de instalação (ou o que você está procurando) como um argumento de linha de comando.
Como último recurso, analisar o arquivo /etc/xinetd.d/myApp para puxar a linha de servidores que inclui o caminho completo para o executável chamado via inetd.