2012-07-18 17 views
24

Piszę skrypt do monitorowania procesora i MEM każdego procesu. W tym celu muszę wysłać nazwę procesu, który ma być monitorowany jako argument wiersza poleceń. Na przykład.Jak uzyskać identyfikator PID procesu, podając nazwę procesu w systemie Mac OS X?

./monitorscript <pname> 

muszę uzyskać PID procesu w skrypcie tak, że można użyć ps -p <pid> wewnątrz.

Jak uzyskać identyfikator procesu podając jego nazwę procesu?

Rozumiem, że może istnieć wiele procesów o tej samej nazwie. Chcę tylko uzyskać pierwszy proces z tej listy.

+6

Jeśli 'pgrep' jest dostępna tylko wtedy można powiedzieć 'pgrep nazwa_procesu'. [Ten post] (http://unix.stackexchange.com/questions/225/pgrep-and-pkill-alternatives-on-mac-os-x) mówi o dostępności 'pgrep' na OSX –

Odpowiedz

47

Odpowiedź powyżej to głównie prawidłowe, po prostu potrzebował trochę szczypanie dla różnych parametrów w Mac OSX.

ps -A | grep -m1 firefox | awk '{print $1}' 
+0

jeśli aplikacja działa, to zwraca poprawny PID, ale jeśli ta konkretna aplikacja nie działa, zwraca numer, który nie jest poprawny. Jestem na os x 10.9 – mohacs

+1

Jeśli aplikacja nie działa, może zwrócić PID procesu grep. Spójrz na moją odpowiedź. – stepmuel

+0

Po prostu testowane jako pidof adb, nic się nie pojawiło. pracował dla jakiegoś procesu. – anything

1

Można spróbować tej

pid=$(ps -o pid=,comm= | grep -m1 $procname | cut -d' ' -f1) 
+0

Drobne poprawki: aby usunąć ścieżkę do procesu, aby nie uzyskać przypadkowych dopasowań i dopasować wszystkie procesy - użyj 'pid = $ (ps -ceo ...)'. –

+0

Nie otrzymuję żadnej odpowiedzi, gdy wpisałem "echo" $ (ps -ceo pid =, comm = | grep -m1 firefox | cut-d '"-f1)" 'w terminalu. Czy robię coś źle ? – Pradep

+0

wynikiem grep jest 'firefox-bin 777', 3 spacje, użyj' cut -d '' -f3' – jackjr300

2

Spróbuj tego:

echo "$(ps -ceo pid=,comm= | awk '/firefox/ { print $1; exit }')" 

Komenda ps produkuje wyjście tak, z PID w pierwszej kolumnie i nazwę pliku wykonywalnego (tylko) w drugiej kolumnie:

bookworm% ps -ceo pid=,comm= 
    1 launchd 
    10 kextd 
    11 UserEventAgent 
    12 mDNSResponder 
    13 opendirectoryd 
    14 notifyd 
    15 configd 

... który awk przetwarza, drukuje pierwszą kolumnę (pid) i wychodzi po pierwszym dopasowaniu.

4

Jest to najkrótsza komenda mogę stwierdzić, że spełnia swoje zadanie:

ps -ax | awk '/[t]he_app_name/{print $1}' 

Umieszczenie nawiasy wokół pierwszego listu zatrzymuje awk ze znalezieniem samego procesu awk.

+0

Jak działają nawiasy kwadratowe w tym rozwiązaniu? – Floris

+0

Z tej odpowiedzi (http://unix.stackexchange.com/a/74186): "Poprzez umieszczenie nawiasów wokół litery i cudzysłowu wokół łańcucha, wyszukujesz wyrażenie regularne, które mówi: Znajdź znak" f ", a następnie "nord", ale ponieważ umieszczasz nawiasy w układzie 'f', po nim następuje ']', więc grep nie pojawi się na liście wyników. – phatmann

+0

Bardzo sprytny. Dziękuję za wyjaśnienie. – Floris

2

To rozwiązanie jest zgodna z nazwą procesu ściślej:

ps -Ac -o pid,comm | awk '/^ *[0-9]+ Dropbox$/ {print $1}' 

To rozwiązanie ma następujące zalety:

  • ignoruje argumenty wiersza poleceń jak tail -f ~/Dropbox
  • ignoruje procesy wewnątrz katalogu jak ~/Dropbox/foo.sh
  • Ignoruje procesy o nazwach takich jak ~/DropboxUID.sh
16

Można zainstalować pidof z Homebrew:

brew install pidof 
pidof <process_name> 
+0

Najmniej fantazyjne; najbardziej użyteczne. – Nate

+0

To naprawdę dobre, łatwe rozwiązanie! Dzięki za to! –

+0

Oto dobre źródło dla pidof https://www.cyberciti.biz/faq/linux-pidof-command-examples-find-pid-of-program/ –

-2

Dlaczego nie można uruchomić górze i użyć opcji sortowania przez innych metryk, inne niż PID? Podobnie jak najwyższy używany PID z CPU/MEM?

top -o cpu < --- sortuje wszystkie procesy, procesora Wykorzystanie

+0

To nie jest pytanie. – bergercookie

12

Można użyć polecenia pgrep jak w poniższym przykładzie

$ pgrep Keychain\ Access 
44186 
+0

Jest to bardzo przydatne! Dziękuję Ci! –

Powiązane problemy