Ubuntu – Why does “ps aux | grep x” give better results than “pgrep x”

bashcommand linetext;

I've just tried the following command on my Ubuntu, it doesn't show a thing:

pgrep php5

shouldn't it return the process id of php5(which the following command just does)?:

ps aux | grep php5

So, what's the difference between these two commands?

Best Answer

ps aux includes the full command line (path and parameters), while pgrep only looks at the first 15 characters of the executable's names

ps aux returns the full command line of each process, while pgrep only looks at the names of the executables.

That means that grepping ps aux output will match anything that occurs in the path or the parameters of a process' binary: e.g. `

  • ps aux | grep php5 will match /usr/share/php5/i-am-a-perl-script.pl
  • but pgrep php5 won't

Take an example from my system -- only we'll use python instead of php5:

  • ps aux | grep python gives us:
izx       2348  0.0  0.7 514928 15644 ?        Sl   Jun24   0:00 /usr/bin/python /usr/lib/unity-lens-video/unity-lens-video
izx       2444  0.0  0.9 547392 18864 ?        Sl   Jun24   0:01 /usr/bin/python /usr/lib/unity-scope-video-remote/unity-scope-video-remote
root      2805  0.0  0.5  95436 12204 ?        S    Jun24   0:00 /usr/bin/python /usr/lib/system-service/system-service-d
izx       6272  0.0  2.9 664400 60320 ?        SNl  Jun24   1:16 /usr/bin/python /usr/bin/update-manager --no-focus-on-map
root     11729  0.0  0.9 180508 19516 ?        S    Jun25   0:00 python /usr/lib/software-properties/software-properties-dbus
  • But pgrep python returns only 11729, which you'll see from the above list is:
root     11729  0.0  0.9 180508 19516 ?        S    Jun25   0:00 python /usr/lib/software-properties/software-properties-dbus