Take the 2-minute tour ×
Ask Ubuntu is a question and answer site for Ubuntu users and developers. It's 100% free, no registration required.

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?

share|improve this question
    
Please remember to take a minute to go back and accept/upvote the best answer(s) to your previous questions (tick/check mark on the left). This way, that question is marked as "answered" and future readers can refer to it knowing the solution works. Thank you...:) –  izx Jun 28 '12 at 10:13
add comment

3 Answers

up vote 15 down vote accepted

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
share|improve this answer
    
"pgrep -l" also truncates the process to 15 characters, which is probably a bug but has been like this for ages –  Thorsen Jun 28 '12 at 10:23
    
Well it's in launchpad as an upstream bug as of 2008 :) "top and ps truncate command after 15 chars" bugs.launchpad.net/ubuntu/+source/procps/+bug/295876 –  Thorsen Jun 28 '12 at 10:42
    
Hah, this explains it, from comment #3: This is due to the fact that some procedures of procs get the command name from /proc/<pid>/stat but not from /proc/<pid>/cmdline. OK, @Thorsen, you win the bug spray, it's a bug :P –  izx Jun 28 '12 at 10:57
    
Thank you so much. According to your answer, pgrep is quite an unreasonable command, because it could well ignore all the running process in some circumstances(e.g.,my php5). Is there any other convincible reason that this command should exist? –  xczzhh Jun 28 '12 at 13:22
    
pgrep and the related pkill are useful but just need to be treated with a little care. Here's a quick hack that does something like pgrep: ps alx|awk '{print $3"\t"$13}'|sed 's/\(.*\t\).*\/\(.*\)/\1 \2/' It prints the PID next to the full process name, but it may have other problems of course :) –  Thorsen Jun 28 '12 at 14:03
show 1 more comment

Just use the -f option to search the full command line and not just the process name:

pgrep -f php5

Unlike the ps | grep construction, pgrep won't pick itself unless you filter out the grep line or use tricks in the pattern. Moreover, should your pattern appear in the USER column, you'll get unwanted processes in the output.

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

or

ps aux | grep p[y]thon
share|improve this answer
add comment
diff <(ps aux|grep x) <(pgrep x) # :)
share|improve this answer
5  
This may answer the answer the question - but perhaps you can expand your answer to explain what this one line command does. –  fossfreedom Jun 28 '12 at 18:46
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.