Nidhi
Nidhi

Reputation: 889

How to get PID of process by specifying process name and store it in a variable to use further?

By using "ucbps" command i am able to get all PIDs

 $ ucbps

   Userid     PID     CPU %  Mem %  FD Used   Server                  Port
   =========================================================================

   512        5783    2.50   16.30  350       managed1_adrrtwls02     61001
   512        8896    2.70   21.10  393       admin_adrrtwls02        61000
   512        9053    2.70   17.10  351       managed2_adrrtwls02     61002

I want to do it like this, but don't know how to do

  1. variable=get pid of process by processname.
  2. Then use this command kill -9 variable.

Upvotes: 70

Views: 277514

Answers (6)

ijoseph
ijoseph

Reputation: 7163

Solution (Exact Process Name Match)

pgrep -x <process_name> | xargs kill -9 

(incidentally, for this specific use case, might as well do pkill -9 -x <process_name>, but the question asked how to get the PID in general)

Details

The problem with the accepted answer (and all other answers) is that pgrep without -x (or manually ps | grep, or, for some reason, pidof) will match processes for which the <process_name> term is a substring.

So, for example, pgrep installd matches, on my machine (macOS 13.0 22A380 arm64) now:

❯ pgrep -l installd
316 uninstalld
33158 system_installd
33160 installd 

I obviously only want 33160, not the other ones.

For some reason, pidof has the same issue:

❯ pidof installd
316 33158 33160 

pregp -x is the the only viable solution (beyond messing around with regexes with the ps | grep solution, I suppose)

❯ pgrep -xl installd
33160 installd 

Upvotes: 0

Pawel K
Pawel K

Reputation: 1

use grep [n]ame to remove that grep -v name this is first... Sec using xargs in the way how it is up there is wrong to rnu whatever it is piped you have to use -i ( interactive mode) otherwise you may have issues with the command.

ps axf | grep | grep -v grep | awk '{print "kill -9 " $1}' ? ps aux |grep [n]ame | awk '{print "kill -9 " $2}' ? isnt that better ?

Upvotes: 0

Stephen
Stephen

Reputation: 419

On a single line...

pgrep -f process_name | xargs kill -9

Upvotes: 41

flazzarini
flazzarini

Reputation: 8181

Another possibility would be to use pidof it usually comes with most distributions. It will return you the PID of a given process by using it's name.

pidof process_name

This way you could store that information in a variable and execute kill -9 on it.

#!/bin/bash
pid=`pidof process_name`
kill -9 $pid

Upvotes: 18

XZS
XZS

Reputation: 2494

pids=$(pgrep <name>)

will get you the pids of all processes with the given name. To kill them all, use

kill -9 $pids

To refrain from using a variable and directly kill all processes with a given name issue

pkill -9 <name>

Upvotes: 86

Ben
Ben

Reputation: 52863

If you want to kill -9 based on a string (you might want to try kill first) you can do something like this:

ps axf | grep <process name> | grep -v grep | awk '{print "kill -9 " $1}'

This will show you what you're about to kill (very, very important) and just pipe it to sh when the time comes to execute:

ps axf | grep <process name> | grep -v grep | awk '{print "kill -9 " $1}' | sh

Upvotes: 110

Related Questions