É possível encontrar o caminho de um programa em execução?


17

Eu tenho um xmms2dprocesso em execução, mas dois arquivos executáveis ​​possíveis (em diretórios diferentes, ambos no caminho do executável) que poderiam ter gerado isso. Eu suspeito que um deles esteja corrompido, porque às vezes esse programa funciona e outras não. O processo em execução agora funciona, então eu quero excluir (ou renomear) o outro.

ps ax|grep "xmms"retorna 8505 ? SLl 2:38 xmms2d -vsem informações do caminho. Dado o PID, eu poderia descobrir se ele foi executado /usr/bin/xmms2dou /usr/local/bin/xmms2d?

Obrigado!


2
ps -C xmmsdeve tornar seu grep obsoleto.
usuário desconhecido

11
O pgrep também faria isso.
Jlliagre 03/03

Respostas:


22

Tente o seguinte:

ls -l /proc/8505/exe

Ou, se você não deseja analisar a saída ls, faça:

readlink /proc/8505/exe

ou

realpath /proc/8505/exe

6

Se você estiver executando o Solaris, o caminho é um pouco diferente do sugerido pelo Linux:

$ for i in $(pgrep bash)
do
  printf "%6d %s\n" $i $(readlink /proc/$i/path/a.out)
done
   577 /usr/bin/bash
 11247 /usr/bin/bash
 13921 /usr/bin/bash
 13992 /tmp/bash

Se você deseja conhecer o diretório de trabalho atual dos processos em execução, pode usar:

pwdx $(pgrep xmms)

por exemplo:

$ pwdx $(pgrep ksh)
2904: /home/jlliagre
2906: /home/jlliagre
3844: /tmp

(suprimido o meu comentário, uma vez que deixou de ser aplicado após a sua edição :)
Kjetil Jorgensen

-1

Começo o mousepad a partir do shell:

mousepad & 
[1] 24289

verifique de onde vem:

which mousepad 
   /usr/bin/mousepad

inicie-o com o caminho:

/usr/bin/mousepad &

veja via ps:

ps v -C mousepad 
  PID TTY      STAT   TIME  MAJFL   TRS   DRS   RSS %MEM COMMAND
24289 pts/3    S      0:00      3    62 85441 10964  1.0 mousepad
24292 pts/3    S      0:00      0    62 85433 10864  1.0 /usr/bin/mousepad

Como vemos, o invocado sem caminho é exibido sem caminho e começou com o PATH e, portanto, pode ser encontrado por

which mousepad

Simples assim, não é? Esperar! E se eu iniciar o mousepad no menu? Bem, pode ser especificado com ou sem o uso das configurações PATH. Eu tentei. Um início normal leva a um simples "mousepad" no ps v -C. Como ~ / bin é a primeira parte do meu PATH, crio um manequim lá e, voila, o manequim é iniciado no menu.

Mas e se você iniciar um programa que se apaga? Que não encontrará o programa excluído e reportará um programa errado, se houver um segundo no caminho.

Então essa é uma condição de corrida. Se você sabe que seus programas não excluir-se ou não são movidos enquanto você está investigando a sua localização, ps v -C NAMEe which NAMEdeve funcionar muito bem.


Isso sempre funcionará? Suponha que eu tenha um executável em dois diretórios diferentes e execute ./someexecutableem ambos?
precisa saber é o seguinte

Não, claro que não, porque ambos vão aparecer como ./someexecutable ou / bin / bash ./someexecutable
desconhecido utilizador

-4

Vá em frente e exclua os dois arquivos (sem a opção force -f). O arquivo que é excluído é o que não estava em execução!

O bloqueio de arquivo executável do sistema não permitirá que você exclua nenhum arquivo atualmente em execução.


Sua resposta não fornece uma resposta real para a pergunta.
Risto Salminen

4
Também está errado. Você pode excluir os executáveis ​​em execução sem problemas. Como você acha que pacotes como init, que estão sempre em execução, são atualizados? Você não pode modificar um executável em execução.
12133 Patrick

11
Isso é assustadoramente errado - não faça isso #
Michael Mrozek
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.