Jeśli znam numer PID procesu, jak mogę uzyskać jego nazwę?

263

Jeśli mam numer PID procesu (na komputerze z systemem UNIX), jak mogę znaleźć nazwę powiązanego z nim procesu?

Co mam do zrobienia?

AndreaNobili
źródło
9
Możesz użyć pslubls -l /proc/$PID/exe
Eddy_Em
1
@Eddy_Em, który da ci plik wykonywalny, który nie zawsze jest nazwą procesu. Poza tym to nie jest przenośne ...
derobert
9
ps -fp PIDpokaże pełne polecenie
Temak

Odpowiedzi:

283

We wszystkich systemach zgodnych z POSIX oraz w systemie Linux możesz użyć ps:

ps -p 1337 -o comm=

Tutaj proces jest wybierany przez PID za pomocą -p. -oOpcja określa format wyjściowy, commczyli nazwę polecenia.

Zobacz także: ps- Podstawowa specyfikacja grupy otwartej, wydanie 6

slhck
źródło
28
comm wydaje się skracać polecenie do 15 znaków. Użycie commandzamiast tego naprawia to.
Nemo
1
[Ubuntu 14.04.4 LTS] $ ps -p 1 -o comm= init $ ps -p 1 -o command= / sbin / init; co oznacza, że ​​nie ma około 15 znaków, może tylko nazwa pliku binarnego vs. pełna ścieżka.
OmarOthman
3
Właściwie commpodaje nazwę command
pliku
45

Możesz znaleźć nazwę procesu lub komendę używaną przez id procesu lub pid z

/proc/pid/cmdline

wykonując

cat /proc/pid/cmdline

Tutaj pid to pid, dla którego chcesz znaleźć nazwę
dla exmaple:

 # ps aux

   ................
   ................
   user  2480  0.0  1.2 119100 12728 pts/0  Sl   22:42   0:01 gnome-terminal
   ................
   ................

Aby znaleźć nazwę procesu używaną przez pid 2480, możesz użyć can

# cat /proc/2480/cmdline 

 gnome-terminal
Stormvirux
źródło
14
Bądź ostrożny: OP wspomina o systemie UNIX. Nie wszystkie systemy UNIX implementują plan 9, podobnie jak plik specyficzny dla procesu. Twoja odpowiedź ogólnie dotyczy tylko Linuksa.
slhck 17.08.13
3
Chociaż to prawda, otagowali pytanie „linux”. Każdy, kto korzysta z systemu operacyjnego UNIX innego niż Linux, będzie przyzwyczajony do modyfikowania odpowiedzi w celu dopasowania do swoich potrzeb
Andrew White,
14

Aby uzyskać ścieżkę programu za pomocą określonego pid, możesz użyć:

ps ax|egrep "^ [PID]"

alternatywnie możesz użyć:

ps -a [PID]

wprowadź opis zdjęcia tutaj

Pedro Lobito
źródło
1
ps -awyświetla listę wszystkich procesów powiązanych z terminalem, nie wymaga żadnych danych wejściowych.
Michael Lee
@MichaelLee Myślę, że to zależy od pswersji, procps version 3.2.7działa poprawnie.
Pedro Lobito
8
# ls -la /proc/ID_GOES_HERE/exe

Przykład:

# ls -la /proc/1374/exe
lrwxrwxrwx 1 chmm chmm 0 Mai  5 20:46 /proc/1374/exe -> /usr/bin/telegram-desktop
Carlos HM Moreira
źródło
Ten jest idealny.
jayarjo,
1
Prawdopodobnie lepiej: readlink /proc/1337/exe. readlink - drukuj rozstrzygnięte dowiązania symboliczne lub kanoniczne nazwy plików.
Pablo A
8

Możesz użyć pmap. Szukam PID 6649. I odcinam dodatkowe szczegóły procesu.

$ pmap 6649 | head -1
6649:   /usr/lib64/firefox/firefox
Mike Studer
źródło
To polecenie pomogło mi bardziej niż potrzebowałem, mam pełną linię procesu, który się rozpoczął. Biorąc pod uwagę proces Java, z pspoleceniem wszystko, co zobaczysz, jest po prostu java, ale pozostałe parametry zostaną wyświetlone w pełni za pomocą pmap.
Daniel Andrei Mincă
3

Możesz także użyć awk w połączeniu z ps

ps aux | awk '$2 == PID number for a process  { print $0 }'

przykład:

root@cprogrammer:~# ps aux | awk '$2 == 1 { print $0 }'
root         1  0.0  0.2  24476  2436 ?        Ss   15:38   0:01 /sbin/init    

do wydrukowania HEAD LINE możesz użyć

 ps --headers aux |head -n 1 && ps aux | awk '$2 == 1 { print $0 }'

                 (or) 

 ps --headers aux |head -n 1; ps aux | awk '$2 == 1 { print $0 }'


root@cprogrammer:~# ps --headers aux |head -n 1 && ps aux | awk '$2 == 1 { print $0 }'
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.2  24476  2436 ?        Ss   15:38   0:01 /sbin/init
Gangadhar
źródło
2
Jest to niestabilne, ponieważ wybrałoby również procesy, które zawierają numer w dowolnym miejscu ich polecenia. Spróbuj na przykład ps ax | grep 1sprawdzić, czy naprawdę zwraca initproces. (W moim przypadku zwraca 119 wierszy - co nie jest pożądane.)
slhck,
1
@slhck Zmodyfikowałem odpowiedź ... dzięki za informacje .. ps -p 1 -o comm = jest najlepszą opcją dla tego pytania.
Gangadhar,
Nie potrzebujemy dwóch przebiegów, aby zachować nagłówki, zamiast tego użyj ps aux | awk 'NR==1 || $2==PID'- i nie musimy mówić, {print $0}ponieważ jest to ustawienie domyślne. Ale jak skomentowałeś, i -ptak jest lepiej.
dave_thompson_085
3

Simmilar do slhck na odpowiedź , ale opierając się na operacje na plikach, zamiast wywołania polecenia:

MYPID=1
cat "/proc/$MYPID/comm"
ThorSummoner
źródło
[Ubuntu 14.04.4 LTS] cat /proc/1/comm=> init, not / sbin / init. Jego odpowiedź zawiera dłuższą wersję. Ale i tak +1.
OmarOthman
2

Zaskakujące, że nikt nie wspomniał o opcji -f (pełne polecenie) dla ps. Lubię używać go z -e (wszystko) i przesyłać wyniki do grep, aby zawęzić wyszukiwanie.

ps -ef | grep <PID>

Jest to również bardzo przydatne do przeglądania pełnych poleceń uruchamianych przez osobę, które zajmują dużo zasobów w systemie. Spowoduje to wyświetlenie opcji i argumentów przekazanych do polecenia.

jdelaporte
źródło
3
Nie działa na BSD (może włączając MacOSX? Nie jestem pewien). Nawet tam, gdzie -e -fsą dostępne, grepmoże powodować wiele fałszywych dopasowań, np. grep 33Obejmuje pid = 933 lub 339, ppid = 33 lub 933 lub 339, wykorzystany czas 33 sekund lub 33 minut, lub nazwa programu lub argument zawierający 33 - w tym grepsam. Wszyscy (AFAIK) psmają -p, więc tylko ps -fp 33.
dave_thompson_085
0

Znajduję najłatwiejszą metodę za pomocą następującego polecenia:

ps -awxs | grep pid
użytkownik666282
źródło
Oprócz tego, że jest wysoce nieefektywny w porównaniu ps -p${pid}, spowoduje to wykrycie wielu fałszywych trafień - w tym grepsamego siebie.
Toby Speight
0

stworzyłem prosty skrypt, aby znaleźć PID i używać go w skryptach bash ...
używaj z rozwagą !!

Zrzut ekranu: http://pastebin.com/Cm9YH67U
Zrzut ekranu



André

André Verwijs
źródło