23

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.

sorin
  • 12,189

6 Answers6

29

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!

7

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.

chepner
  • 7,041
6

Just use pgrep, it's much more straight forward

pgrep -o -x xxxx

The above selects the oldest process with the exact name

5

pidof xxx will suffice on linux

Jakuje
  • 10,827
0

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
AlG
  • 425
0

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 ^

pizza
  • 101