How to get pgrep to display full process info

36,345

Solution 1

pgrep's output options are pretty limited. You will almost certainly need to send it back through ps to get the important information out. You could automate this by using a bash function in your ~/.bashrc.

function ppgrep() { pgrep "$@" | xargs --no-run-if-empty ps fp; }

Then call the command with.

ppgrep <pattern>

Solution 2

Combine pgrep with ps using xargs!

pgrep <your pgrep-criteria> | xargs ps <your ps options> -p

For example try

pgrep -u user | xargs ps -f -p

to get a full process list of user. Option -u user limits pgrep to the user given (as a number or name) while the ps options -f -p request a full format listing for the selected PID.

It's nice that you keep the first line with the column names. grep always drops the column names.

Solution 3

The following only gives you PID + full command-line. For "all the info ps does", see other answers...

Most linuxes use procps-ng. Since 3.3.4 (released in 2012), pgrep -a (--list-full) shows the full command line.
Note: By default pgrep only matches the pattern you give against the executable name. If you want to match against the full command line (as grepping ps does), add the -f (--full) option.

In older versions (including the original procps project), -l option showed info but it's behavior varied:

  • pgrep -fl matched the pattern against full command line and showed the full command line.
  • pgrep -l alone matched only executable name and showed only executable name.
    If you don't want full match, you couldn't see the full command line :-( [https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=526355#15]

Not sure what code *BSD use but their man page documents the old -fl behavior.

Unfortunately you can't even use -fl portably - in recent procps-ng, -f (--list-name) always prints only the executable name.

Solution 4

Linux grep

For the GNU version of pgrep long + fuzzy output is achieved with -af and the string must be case-sensitive (i.e. there is no option for case-insensitivity).

$ pgrep -af apache

OUTPUT:
    1748 /usr/sbin/apache2 -k start

Man page:

   -a, --list-full
       List  the  full  command line as well as the process ID.  (pgrep only.)

   -f, --full
       The pattern is normally only matched against the process name.  
       When -f is set, the full command  line is used.

MacOS/BSD grep

On MacOS/BSD -l (long output) in combination with -f (match against full argument lists) will display the complete command (-i adds case-insensitivity):

$ pgrep -fil ssh

OUTPUT:
    33770 ssh: [email protected] [mux] t

man page:

 -l          Long output.  For pgrep, print the
             process name in addition to the
             process ID for each matching
             process.  If used in conjunction
             with -f, print the process ID and
             the full argument list for each
             matching process.  For pkill, dis-
             play the kill command used for
             each process killed.

❗️NOTE: GNU grep can be installed on MacOS with brew install pgrep — this will expose the GNU flavour under /usr/local/bin/pgrep and depending on your $PATH config might break code which relies on the BSD syntax of pgrep.

Solution 5

Use the -v option to grep - it returns everything BUT the requested pattern.

ps -ef | grep <process> | grep -v grep
Share:
36,345

Related videos on Youtube

JoelFan
Author by

JoelFan

Updated on September 17, 2022

Comments

  • JoelFan
    JoelFan over 1 year

    Is there any way to get pgrep to give me all the info about each process that ps does? I know I can pipe ps through grep but that's a lot of typing and it also gives me the grep process itself which I don't want.

  • JoelFan
    JoelFan over 13 years
    Thanks! I modified it to: function ppgrep() { pgrep "$@" | xargs ps fp 2> /dev/null; } Otherwise, if no processes match your search, it dumps a whole ps usage megilla.
  • prusswan
    prusswan almost 10 years
    excellent! this resolves a strange problem with arcgis server startup script for xfvb
  • Dave M
    Dave M almost 9 years
    Can you please elaborate. More info would improve this answer
  • Erik Nomitch
    Erik Nomitch over 8 years
    On OS X, the ps needs a hyphen for the flags: function ppgrep() { pgrep "$@" | xargs ps -fp 2> /dev/null; }
  • Doug
    Doug about 8 years
    If you want to avoid the ps usage page, GNU xargs has an option, -r that will only execute the command if it has received a list.
  • BringBackCommodore64
    BringBackCommodore64 over 7 years
    This was the best answer for me. It shows you the full command without being truncated as it happens with pgrep -u user | xargs ps -f -p
  • Scott Prive
    Scott Prive almost 7 years
    This should be the accepted answer, because it uses unix pipes in a proper way, taking a list of PIDs from one tool and feeding back into another (if it seems like hackery, it's not - this technique can be used in LOTS of UNIX tools, like email grep tools. The Bash function ppgrep() is an unnecessary dependency, and avoids confronting the learning opportunity presented here.)
  • Igor Mikushkin
    Igor Mikushkin about 5 years
    More concise way is ps fp $(pgrep -d, "$@")