How to get only the user, the pid and the command run for a specific process? (Ubuntu 11.10)
I guess you are looking for the -o argument:
-o format:
user-defined format. format is a single argument in the form of a blank-separated or comma-separated list, which offers a way to specify individual output columns. The recognized keywords are described in the STANDARD FORMAT SPECIFIERS section below. Headers may be renamed (ps -o pid,ruser=RealUser -o comm=Command) as desired. If all column headers are empty (ps -o pid= -o comm=) then the header line will not be output. Column width will increase as needed for wide headers; this may be used to widen up columns such as WCHAN (ps -o pid,wchan=WIDE-WCHAN-COLUMN -o comm). Explicit width control (ps opid,wchan:42,cmd) is offered too. The behavior of ps -o pid=X,comm=Y varies with personality; output may be one column named "X,comm=Y" or two columns named "X" and "Y". Use multiple -o options when in doubt. Use the PS_FORMAT environment variable to specify a default as desired; DefSysV and DefBSD are macros that may be used to choose the default UNIX or BSD columns.
So the command you want would be (Ubuntu):
ps -o uid,pid,cmd -ef|grep python
under OpenSolaris the command is:
ps -o ruser,pid,comm -ef|grep python
The simplest would probably be:
$ ps o uid=,pid=,cmd= -C python
1000 26126 python
That way you get everything directly from ps
and don't need to parse anything.
From the ps
man page:
-o format
User-defined format. format is a single argument in the form of a blank-separated or comma-separated list, which offers a way to specify individual output columns. [...] Headers may be renamed (ps -o pid,ruser=RealUser -o comm=Command) as desired. If all column headers are empty (ps -o pid= -o comm=) then the header line will not be output.
-C cmdlist
Select by command name. This selects the processes whose executable
name is given in cmdlist.
The -C
option will work if you are running python
interactively, not if python is running a script. In that case you should use -C scriptname.py
instead.
ps -eo user,pid,cmd | grep [p]ython
Example:
$ 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
user 16613 /usr/bin/python3 /usr/share/system-config-printer/applet.py
Explanation:
-
-e
all processes -
-o
user-defined format -
user,pid,cmd
Show user, process ID, command columns
Note: if you use -f
with -o
as others have suggested, you may get errors. This is because both of these parameters control the output format, and only one of them should be used:
$ ps --help | grep -A 2 "output format"
*********** output format **********
-o,o user-defined -f full
-j,j job control s signal
My version of PS is different, so it might require some tweaking, but you can use cut (and possibly tr depending on what you are trying to achieve) - for example something like
ps ef | cut -c1-16,50-
Will provide the characters 1-16 and 50 onwards from each line of your ps statement. (Your actual numbers will probably need a bit of massaging).
Another way to do it (but you will loose formatting) might be
ps ef | tr -s " " | cut -f1,2,8- -d" "
Which will compress the whitespace in the ps command, then take fields 1,2 and 8 onwards and display them.