Come far eseguire solo l'utente, il pid e il comando per un processo specifico? (Ubuntu 11.10)


19

Quando lo faccio ps -ef|grep pythonottengo quanto segue:

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

Come posso ottenere solo l' utente che sta eseguendo il processo, il pid e il comando vengono eseguiti per il processo come nel seguente output?

myusername  4492 /home/myusername/.virtualenvs/myproject/bin/ipython manage.py runserver
root        6665 /usr/bin/python /usr/lib/system-service/system-service-d

funziona? ps --fields="user pid command"
Pratala del

Non l'ho provato. L'ho trovato in rete. Non vicino a una macchina Ubuntu ora. Scusa.
Vedremo

No, ricevo ERRORE: opzione lunga gnu sconosciuta. Per te funziona?
Bentley4,

Risposte:


13

Immagino che tu stia cercando l'argomento -o:

-o formato:

formato definito dall'utente. Il formato è un singolo argomento sotto forma di un elenco separato da virgole o separato da virgola, che offre un modo per specificare singole colonne di output. Le parole chiave riconosciute sono descritte nella sezione SPECIFICATORI DI FORMATO STANDARD di seguito. Le intestazioni possono essere rinominate (ps -o pid, ruser = RealUser -o comm = Command) come desiderato. Se tutte le intestazioni di colonna sono vuote (ps -o pid = -o comm =), la riga di intestazione non verrà emessa. La larghezza della colonna aumenterà secondo necessità per le intestazioni larghe; questo può essere usato per allargare colonne come WCHAN (ps -o pid, wchan = WIDE-WCHAN-COLUMN -o comm). Viene offerto anche il controllo esplicito della larghezza (ps opid, wchan: 42, cmd). Il comportamento di ps -o pid = X, comm = Y varia con la personalità; l'output può essere una colonna denominata "X, comm = Y" o due colonne denominate "X" e "Y". Utilizzare più opzioni -o in caso di dubbio. Utilizzare la variabile d'ambiente PS_FORMAT per specificare un valore predefinito come desiderato; DefSysV e DefBSD sono macro che possono essere utilizzate per scegliere le colonne UNIX o BSD predefinite.

Quindi il comando desiderato sarebbe (Ubuntu):

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

sotto OpenSolaris il comando è:

ps -o ruser,pid,comm -ef|grep python

3
Funziona davvero per te? Quando Warning: bad ps syntax, perhaps a bogus '-'? See http://procps.sf.net/faq.html
eseguo

Sì, funziona per me in ksh con OpenSolaris. L'output è come desideri ... Controlla le pagine man per ps sul tuo sistema man ps. Forse la sintassi è leggermente diversa sul tuo sistema.
Simon,

1
Ma l'OP è su bash e non su ksh
pratnala il

1
@ Bentley4 Se si desidera solo il comando e non sono necessarie ulteriori informazioni, è possibile eliminare l'argomento -f e utilizzare il comando seguente:ps -o uid,pid,cmd -e|grep python
Simon

1
@ Bentley4:ps -o user,pid,cmd -e|grep '[p]ython'
Simon

3

Il più semplice sarebbe probabilmente:

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

In questo modo ottieni tutto direttamente pse non devi analizzare nulla.

Dalla pspagina man:

-o formato

Formato definito dall'utente. Il formato è un singolo argomento sotto forma di un elenco separato da virgole o separato da virgola, che offre un modo per specificare singole colonne di output. [...] Le intestazioni possono essere rinominate (ps -o pid, ruser = RealUser -o comm = Command) come desiderato. Se tutte le intestazioni di colonna sono vuote (ps -o pid = -o comm =), la riga di intestazione non verrà generata.

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

L' -Copzione funzionerà se si esegue in modo pythoninterattivo, non se python esegue uno script. In tal caso -C scriptname.pyinvece dovresti usare .


1

La mia versione di PS è diversa, quindi potrebbe richiedere qualche modifica, ma puoi usare cut (e forse tr a seconda di ciò che stai cercando di ottenere) - ad esempio qualcosa di simile

ps ef | taglio -c1-16,50-   

Fornirà i caratteri da 1 a 16 e 50 in poi da ciascuna riga dell'istruzione ps. (Probabilmente i tuoi numeri effettivi avranno bisogno di un po 'di massaggio).

Un altro modo per farlo (ma perderai la formattazione) potrebbe essere

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

Che comprimerà lo spazio bianco nel comando ps, quindi prenderà i campi 1,2 e 8 in poi e li visualizzerà.


Per un solo processo ottengo una mezza pagina di informazioni su uno schermo intero con quei comandi. È piuttosto illeggibile, sto "massaggiando" i parametri ma finora non sono stato in grado di ottenere nulla da remoto di ciò che voglio.
Bentley4

1
ps -eo user,pid,cmd | grep [p]ython

Esempio:

$ 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

Spiegazione:

  • -e tutti i processi
  • -o formato definito dall'utente
  • user,pid,cmd Mostra colonne utente, ID processo, comando

Nota: se lo usi -fcon -ecome altri hanno suggerito, potresti ricevere errori. Questo perché entrambi questi parametri controllano il formato di output e solo uno di essi dovrebbe essere usato:

$ ps --help | grep -A 2 "output format"
*********** output format **********
-o,o user-defined  -f full
-j,j job control   s  signal
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.