Take the 2-minute tour ×
Super User is a question and answer site for computer enthusiasts and power users. It's 100% free, no registration required.

I am looking for a single line that does return the pid of a running process.

Currently I have:

ps -A -o pid,cmd|grep xxx|head -n 1

And this returns the fist pid, command. I need only the first number from the output and ignore the rest. I suppose sed or awk would help here but my experience with them is limited.

Also, this has another problem, it will return the pid of grep if the xxx is not running.

It's really important to have a single line, as I want to reuse the output for doing something else, like killing that process.

share|improve this question
1  
pipe it through head and specify the line to return with -n 1? –  Mike McMahon May 23 '12 at 17:31
add comment

migrated from stackoverflow.com Sep 30 '12 at 8:24

This question came from our site for professional and enthusiast programmers.

5 Answers

If you just want the pid of the process you can make use of pgrep if available. pgrep <command> will return the pid of the command (or list of pids in case there are more than one instance of the command running, in which case you can make use of head or other appropriate commands)
Hope this helps!

share|improve this answer
    
+1 My usual use of pgrep: kill `pgrep xxx` –  Steve May 23 '12 at 22:34
9  
@steve: Perhaps you should look at pkill. –  Dennis Williamson May 24 '12 at 1:17
add comment

Just one more command needed; you want only the first field from a line of space-separated values:

ps -A -o pid,cmd|grep xxx | grep -v grep |head -n 1 | awk '{print $1}'

Well, two. I added another grep to remove grep itself from the output.

share|improve this answer
add comment

Just use pgrep, it's much more straight forward

pgrep -o -x xxxx

The above selects the oldest process with the exact name

share|improve this answer
    
And since OP wants to use the command to kill the process, pkill (with the same args) would be the most direct choice. –  bstpierre Sep 30 '12 at 1:59
add comment

Running on Cygwin so I can't use -A and -o, but something like this:

$ ps
      PID    PPID    PGID     WINPID   TTY     UID    STIME COMMAND
     4580       1    4580       4580  ?       55573   May 21 /usr/bin/mintty
     5808    7072    5808       7644  pty3    55573 13:35:31 /usr/bin/ps
     7072    5832    7072       6424  pty3    55573   May 21 /usr/bin/bash


$ ps | grep '/usr/bin/mintty' | head -n 1 | awk '{print $1}'
4580
share|improve this answer
add comment

you can do something like

ps -A -o cmd,pid | egrep "^xxx " | head -n 1 | sed -r -e 's/.* ([0-9]+)$/\1/'

then xxx has to be process name and it will not pick up grep because of the anchor ^

share|improve this answer
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.