Questão Como posso saber o caminho absoluto de um processo em execução?


Se eu tiver várias cópias do mesmo aplicativo no disco e apenas uma estiver em execução, como posso ver com psComo posso saber o absoluto caminho para distingui-lo dos outros?


79


origem




Respostas:


% sudo ls -l /proc/PID/exe

por exemplo:

% ps -auxwe | grep 24466
raiz 24466 0,0 0,0 1476 280? S 2009 0:00 supervisionar sshd
% sudo ls -l / proc / 24466 / exe
lrwxrwxrwx 1 raiz do root 0 1 de fev 18:05 / proc / 24466 / exe -> /package/admin/daemontools-0.76/command/supervise

90



No meu sistema (Ubuntu 14.04) você não precisa ser superusuário para executar o ls comando. - jarno
@jarno ls: cannot read symbolic link /proc/28783/exe: Permission denied - não se trata de executar o ls comando, trata-se de acessar as informações do processo de um processo que não pertence a você. Na minha caixa, cerca de 97% de todos os processos listados em / proc são processos raiz, e os outros são distribuídos em 11 usuários diferentes. - Irfy


Usar:

pwdx $pid

Isso lhe dá o diretório de trabalho atual do pid, não seu caminho absoluto.

Geralmente o which comando irá dizer-lhe qual está sendo invocado a partir do shell:

#> which vlc
/usr/bin/vlc

12



esta resposta precisa mais upvote .. - Kokizzu
@Kokizzu Não, isso não acontece porque não responde à pergunta. O comando which apenas informa qual binário será executado se você executar o comando agora. A questão era "qual binário já está sendo executado lá". Imagine, por exemplo, ter uma dúzia de jdks no seu computador. Se você quer saber de um processo java em execução do qual o jdk foi retirado, o que não ajuda você com isso. Ele só lhe dirá de qual jdk ele será tirado, se você executá-lo agora. A resposta aceita também é a correta. - noamik
Uma maneira óbvia é que esta resposta está errada: na minha máquina eu executo processos com diferentes versões do JDK e uns 32bits / 64bits. Se eu quiser identificar a versão correta de jstack / jmap para o processo, a resposta acima não funcionará enquanto a resposta aceita. - Daniel Da Cunha
@Kokizzu Isso só responde a pergunta: "Qual é o diretório de trabalho atual do processo $pid"A postagem editada ainda não responde à pergunta. which apenas diz "Se o comando está no caminho, então o que é?" - John Strood


Uma maneira é ps -ef


11



não funcionou para um serviço específico, apenas fornece o caminho relativo - Jader Dias
Ajudou-me a identificar um processo através do comando em que foi iniciado. - jpierson


ps auxwwwe

Fonte:

https://serverfault.com/questions/62322/getting-full-path-of-executables-in-ps-auxwww-output


5



não mostra todos os caminhos qualificados completos no meu linux: "root 24466 0.0 0.0 1476 280? S 2009 0:00 supervisionar sshd" por exemplo - akira
Isso é mais preciso do que as outras respostas ... talvez não tão útil, mas mais a resposta certa. Votado - John Hunt


A resposta rápida é usar ps com opções ou o /proc informações do sistema de arquivos. Aquilo vai geralmente trabalho, mas não é garantido. Em geral, não há resposta definida e garantida. Por exemplo, e se o arquivo em execução for excluído durante a execução, para que não haja caminho para o arquivo?

Vejo o FAQ do Unix para um pouco mais detalhadamente, particularmente as questões 4.3 e 4.4.


2





Por que todos esperam que você conheça o PID? Aqui está a maneira humana:

pwdx `pgrep ###process_name###`

2



A questão afirma “como eu posso ver com ps”, Então provavelmente exibirá o PID - Scz
Ah ok verdade. Eu ainda acho que isso seja mais rápido em muitos dos meus casos de uso. - moodboom


Você poderia usar

readlink /proc/$(pgrep -x -U $(id -ur) APP_NAME)/exe

ou

find /proc/$(pgrep -x -U $(id -ur) APP_NAME)/exe -printf "%l\n"

para obter o caminho absoluto. PID é o processo.


0





lsof é uma opção. Você pode tentar algo como abaixo:

lsof -p PROCESS_ID

Isso listará todos os arquivos abertos pelo processo, incluindo a localização real do executável. É então possível adicionar mais alguns awk, cut, grep etc. para descobrir as informações que você está procurando.

Como exemplo, executei os seguintes comandos para identificar de onde meu processo 'java' veio:

lsof -p 12345 | awk '{print $ NF}' | grep 'java $'


0



Como isso é diferente do que as respostas já postadas exatamente? - Pimp Juice IT