Jak uzyskać tylko użytkownika, identyfikator pid i polecenie uruchomione dla określonego procesu? (Ubuntu 11.10)

19

Kiedy to zrobię ps -ef|grep python, otrzymuję:

myusername  4492  2994  0 10:32 pts/0    00:00:01 /home/myusername/.virtualenvs/myproject/bin/ipython manage.py runserver
root        6665     1  0 10:42 ?        00:00:00 /usr/bin/python /usr/lib/system-service/system-service-d
myusername 14051 13497  0 11:28 pts/7    00:00:00 grep --color=auto python

Jak uzyskać zamiast tego tylko użytkownika, który uruchamia proces, identyfikator pid i polecenie są uruchamiane dla procesu, jak w poniższym pliku wyjściowym?

myusername  4492 /home/myusername/.virtualenvs/myproject/bin/ipython manage.py runserver
root        6665 /usr/bin/python /usr/lib/system-service/system-service-d
Bentley4
źródło
czy to działa? ps --fields="user pid command"
pratnala
Nie próbowałem tego. Znalazłem to w sieci. Nie w pobliżu maszyny Ubuntu. Przepraszam. Zobaczymy się później i dam znać
pratnala
Nie, otrzymuję BŁĄD: Nieznana opcja długiego GNU. Czy Ci to pasuje?
Bentley4,

Odpowiedzi:

13

Chyba szukasz argumentu -o:

-o format:

format zdefiniowany przez użytkownika. format jest pojedynczym argumentem w postaci listy rozdzielanej spacjami lub przecinkiem, która oferuje sposób określania poszczególnych kolumn wyjściowych. Rozpoznane słowa kluczowe opisano poniżej w sekcji STANDARDOWE SPECYFIKATORY FORMATU. Nazwy nagłówków mogą być zmieniane (ps -o pid, ruser = RealUser -o comm = Command) według potrzeb. Jeśli wszystkie nagłówki kolumn są puste (ps -o pid = -o comm =), to wiersz nagłówka nie zostanie wyprowadzony. Szerokość kolumny wzrośnie w razie potrzeby w przypadku szerokich nagłówków; można to wykorzystać do poszerzenia kolumn, takich jak WCHAN (ps -o pid, wchan = WIDE-WCHAN-COLUMN -o comm). Oferowana jest także jawna kontrola szerokości (ps opid, wchan: 42, cmd). Zachowanie ps -o pid = X, comm = Y różni się w zależności od osobowości; wyjściem może być jedna kolumna o nazwie „X, comm = Y” lub dwie kolumny o nazwie „X” i „Y”. W razie wątpliwości użyj wielu opcji -o. Użyj zmiennej środowiskowej PS_FORMAT, aby określić wartość domyślną zgodnie z potrzebami; DefSysV i DefBSD to makra, których można użyć do wybrania domyślnych kolumn UNIX lub BSD.

Poleceniem, które chcesz, byłoby (Ubuntu):

ps -o uid,pid,cmd -ef|grep python

w OpenSolaris polecenie to:

ps -o ruser,pid,comm -ef|grep python
Szymon
źródło
3
Czy to naprawdę działa dla ciebie? Kiedy Warning: bad ps syntax, perhaps a bogus '-'? See http://procps.sf.net/faq.html
wykonuję
Tak, działa dla mnie w ksh pod OpenSolarisa. Dane wyjściowe są takie, jak chcesz ... Sprawdź strony podręcznika systemowego pod kątem ps w twoim systemie man ps. Może składnia jest nieco inna w twoim systemie.
Simon
1
Ale OP jest w bashu, a nie na ksh
pratnala
1
@ Bentley4 Jeśli potrzebujesz tylko polecenia i nie potrzebujesz dodatkowych informacji, możesz upuścić argument -f i użyć następującego polecenia:ps -o uid,pid,cmd -e|grep python
Simon
1
@ Bentley4:ps -o user,pid,cmd -e|grep '[p]ython'
Simon
3

Najprostszy byłby prawdopodobnie:

$ ps o uid=,pid=,cmd= -C python
1000 26126 python

W ten sposób otrzymujesz wszystko bezpośrednio psi nie musisz niczego analizować.

Ze strony podręcznika ps:

-o format Format

zdefiniowany przez użytkownika. format jest pojedynczym argumentem w postaci listy rozdzielanej spacjami lub przecinkiem, która oferuje sposób określania poszczególnych kolumn wyjściowych. [...] Nazwy nagłówków mogą być zmieniane (ps -o pid, ruser = RealUser -o comm = Command) według potrzeb. Jeśli wszystkie nagłówki kolumn są puste (ps -o pid = -o comm =), to wiersz nagłówka nie zostanie wyprowadzony.

-C cmdlist
     Select by command name.  This selects the processes whose executable 
     name is given in cmdlist.

Ta -Copcja będzie działać, jeśli działasz pythoninteraktywnie, a nie jeśli Python uruchamia skrypt. W takim przypadku powinieneś użyć -C scriptname.pyzamiast tego.

terdon
źródło
1

Moja wersja PS jest inna, więc może wymagać drobnych poprawek, ale możesz użyć cięcia (i ewentualnie tr w zależności od tego, co próbujesz osiągnąć) - na przykład coś w rodzaju

ps ef | cut -c1-16,50-   

Zapewni znaki od 1 do 16 i 50 od każdego wiersza instrukcji ps. (Twoje rzeczywiste liczby prawdopodobnie będą wymagać trochę masowania).

Innym sposobem na to (ale stracisz formatowanie) może być

ps ef | tr -s "" | cut -f1,2,8- -d ""

Który skompresuje białe znaki w poleceniu ps, a następnie weź pola 1,2 i 8 i wyświetl je.

Davidgo
źródło
W przypadku tylko jednego procesu z tymi poleceniami wyświetlam pół strony informacji na pełnym ekranie. Jest to dość nieczytelne, „masuję” parametry, ale jak dotąd nie byłem w stanie uzyskać niczego zdalnie tego, czego chcę.
Bentley4,
1
ps -eo user,pid,cmd | grep [p]ython

Przykład:

$ ps -eo user,pid,cmd | grep [p]ython
root      1056 /usr/bin/python3 /usr/bin/networkd-dispatcher --run-startup-triggers
root      1735 /usr/bin/python3 /usr/bin/fail2ban-server -xf start
bmaupin  16613 /usr/bin/python3 /usr/share/system-config-printer/applet.py

Wyjaśnienie:

  • -e wszystkie procesy
  • -o format zdefiniowany przez użytkownika
  • user,pid,cmd Pokaż użytkownika, identyfikator procesu, kolumny poleceń

Uwaga: jeśli używasz -fz tym, -eco sugerują inni, mogą pojawić się błędy. Wynika to z faktu, że oba te parametry kontrolują format wyjściowy i należy użyć tylko jednego z nich:

$ ps --help | grep -A 2 "output format"
*********** output format **********
-o,o user-defined  -f full
-j,j job control   s  signal
bmaupin
źródło