Questão Encontre * onde * o executável é para um processo atualmente em execução


Se eu tiver 2 executáveis ​​(/path/to/gcc/myapp.exee /path/to/intel/myapp.exe) onde um é compilado com um compilador intel e um é compilado com o gcc padrão, ambos serão exibidos em top como apenas myapp. Se eu executar os dois e tiver processos em execução como myapp, existe uma maneira de descobrir qual processo está vindo de qual executável?

Temos um monte de aplicativos instalados em nosso cluster e estou interessado, não apenas em quais aplicativos estão sendo usados ​​mais, mas que versões dos aplicativos estão sendo usados. Se eu vejo 500 ocorrências de R sendo executado, eu gostaria de saber se 100 deles são de /path/to/R-3.2.1/intel/R e os outros 400 são de /path/to/R-3.1.3/gcc/RComo posso fazer isso?


2


origem




Respostas:


Você pode fazer isso com o /proc sistema de arquivos, como observado no proc(5) página de manual:

/proc/[pid]/exe

No Linux 2.2 e posterior, esse arquivo é um link simbólico   contendo o caminho real do comando executado.

Porque é um link simbólico, você pode ler o alvo (faça um ls -l para ver o nome do caminho).

o [pid] claro, significa um ID de processo para o executável específico em que você está interessado, em tempo de execução.

(É improvável que você tenha um sistema rodando um kernel Linux tão antigo, então "sempre funciona" deve ser bom o suficiente).

Para obter uma contagem, você simplesmente precisa de um script que passe por /proc, para cada diretório que você possui (desde que você está executando os programas, você pode ver /proc dados), e combinando os nomes de caminho com os que você está interessado int. o readlink programa, por exemplo, é útil em scripts bash (e como é parte de coreutils, você provavelmente tem isso em um sistema Linux).


4



Você não precisa executar um nome de caminho; você pode inspecionar isto. - Thomas Dickey


Para fazer isso, você pode iniciar tope, em seguida, pressione c no seu teclado para alternar a visualização completa do caminho.


2



Isso só funciona em alguns dos processos. Estou assumindo onde o caminho inteiro foi usado na instrução de execução? Existe alguma maneira de fazer isso quando o aplicativo não foi dado o caminho completo? - drjrm3


Se esses processos forem executados com uma linha de comando diferente (por exemplo, usando o caminho completo), você pode pressionar c para mostrar / ocultar a linha de comando completa com a qual o processo foi executado.


0