I've just tried the following command on my Ubuntu, it doesn't show a thing:
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?
ps auxincludes 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 php5will match
Take an example from my system -- only we'll use python instead of
ps aux | grep pythongives 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
pgrep pythonreturns 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
ps aux | grep x command gives "better" results than
pgrep x essentially because you are missing an option with the latter.
Simply use the
-f option for
pgrep to search the full command line and not only the process name which is its default behavior, eg:
pgrep -f php5
ps | grep construction with which you need to filter out the
grep line or use pattern tricks,
pgrep just won't pick itself by design.
Moreover, should your pattern appear in
USER column, you'll get unwanted processes in the output,
pgrep doesn't suffer from this flaw.
If you want full details instead of just the pids, you can use:
ps wup $(pgrep -f python)
which is simpler and more reliable than
ps aux | grep python | grep -v grep
ps aux | grep p[y]thon
diff <(ps aux|grep x) <(pgrep x) # :)