Reputation: 10941
I often need to kill a process during programming.
The way I do it now is:
[~]$ ps aux | grep 'python csp_build.py'
user 5124 1.0 0.3 214588 13852 pts/4 Sl+ 11:19 0:00 python csp_build.py
user 5373 0.0 0.0 8096 960 pts/6 S+ 11:20 0:00 grep python csp_build.py
[~]$ kill 5124
How can I extract the process id automatically and kill it in the same line?
Like this:
[~]$ ps aux | grep 'python csp_build.py' | kill <regex that returns the pid>
Upvotes: 810
Views: 777031
Reputation: 6223
on Mac, I tried every snipped from this thread to kill slack that got stuck and prevented logout, but the only thing that worked was to open ActivityMonitor, find there slack and 4 slackhelper processes and forcefully quit them all.
Upvotes: 0
Reputation: 130
pkill -f 'PATTERN'
Will kill all the processes that the pattern PATTERN matches. With the -f option, the whole command line (i.e. including arguments) will be taken into account. Without the -f option, only the command name will be taken into account.
Upvotes: 3
Reputation: 882326
In bash
, using only the basic tools listed in your question(1), you should be able to do:
kill $(ps aux | grep '[p]ython csp_build.py' | awk '{print $2}')
Details on its workings are as follows:
ps
gives you the list of all the processes.grep
filters that based on your search string, [p]
is a trick to stop you picking up the actual grep
process itself.awk
just gives you the second field of each line, which is the PID.$(x)
construct means to execute x
then take its output and put it on the command line. The output of that ps
pipeline inside that construct above is the list of process IDs so you end up with a command like kill 1234 1122 7654
.Here's a transcript showing it in action:
pax> sleep 3600 &
[1] 2225
pax> sleep 3600 &
[2] 2226
pax> sleep 3600 &
[3] 2227
pax> sleep 3600 &
[4] 2228
pax> sleep 3600 &
[5] 2229
pax> kill $(ps aux | grep '[s]leep' | awk '{print $2}')
[5]+ Terminated sleep 3600
[1] Terminated sleep 3600
[2] Terminated sleep 3600
[3]- Terminated sleep 3600
[4]+ Terminated sleep 3600
and you can see it terminating all the sleepers.
Explaining the grep '[p]ython csp_build.py'
bit in a bit more detail: when you do sleep 3600 &
followed by ps -ef | grep sleep
, you tend to get two processes with sleep
in it, the sleep 3600
and the grep sleep
(because they both have sleep
in them, that's not rocket science).
However, ps -ef | grep '[s]leep'
won't create a grep
process with sleep
in it, it instead creates one with the command grep '[s]leep'
and here's the tricky bit: the grep
doesn't find that one, because it's looking for the regular expression "any character from the character class [s]
(which is basically just s
) followed by leep
.
In other words, it's looking for sleep
but the grep process is grep '[s]leep'
which doesn't have the text sleep
in it.
When I was shown this (by someone here on SO), I immediately started using it because
| grep -v grep
; and(1) If you're not limited to using those basic tools, there's a nifty pgrep
command which will find processes based on certain criteria (assuming you have it available on your system, of course).
For example, you can use pgrep sleep
to output the process IDs for all sleep
commands (by default, it matches the process name). If you want to match the entire command line as shown in ps
, you can do something like pgrep -f 'sleep 9999'
.
As an aside, it doesn't list itself if you do pgrep pgrep
, so the tricky filter method shown above is not necessary in this case.
You can check that the processes are the ones you're interested in by using -a
to show the full process names. You can also limit the scope to your own processes (or a specific set of users) with -u
or -U
. See the man
page for pgrep
/pkill
for more options.
Once you're satisfied it will only show the processes you're interested in, you can then use pkill
with the same parameters to send a signal to all those processes.
Upvotes: 1735
Reputation: 2895
if you wanna do it mostly within awk
, try
for i in $(jot 5); do
(python3 -c 'import sys; [ print(_) for _ in sys.stdin ]' ) & done;
sleep 1; ps aux | {m,g}awk '
/[p]ython/ {
_=(_)" "$2
} END {
system("echo \47 kill "(_)" \47")
system( "kill -9 " _) }'
[302] 14236
[303] 14237
[304] 14238
[305] 14239
[306] 14240
[303] + suspended (tty input) ( python3 -c 'import sys; [ print(_) for _ in sys.stdin ]'; )
[305] + suspended (tty input) ( python3 -c 'import sys; [ print(_) for _ in sys.stdin ]'; )
[304] + suspended (tty input) ( python3 -c 'import sys; [ print(_) for _ in sys.stdin ]'; )
[302] + suspended (tty input) ( python3 -c 'import sys; [ print(_) for _ in sys.stdin ]'; )
[306] + suspended (tty input) ( python3 -c 'import sys; [ print(_) for _ in sys.stdin ]'; )
kill 14239 14237 14236 14240 14238
[305] killed ( python3 -c 'import sys; [ print(_) for _ in sys.stdin ]'; )
[303] killed ( python3 -c 'import sys; [ print(_) for _ in sys.stdin ]'; )
[306] + killed ( python3 -c 'import sys; [ print(_) for _ in sys.stdin ]'; )
[304] - killed ( python3 -c 'import sys; [ print(_) for _ in sys.stdin ]'; )
[302] + killed ( python3 -c 'import sys; [ print(_) for _ in sys.stdin ]'; )
Upvotes: 0
Reputation: 511
I don't like killing things based purely on a blind result from grep - what if I mistakenly match more than desired?
I know this is going to get downvoted by command line purists, but I prefer an interactive filter for this case, such as pick (apt-get install pick). With this kind of tool the filtered result is displayed as you type, so you can see exactly what will get killed when you hit enter.
Thus the one-liner would become
function killpick { ps ax | pick -q "$1" | awk '{print $1}' | xargs kill -9; }
killpick by itself gives a chooser with incremental filtering, with the optional argument giving a starting string for the filter.
Upvotes: -1
Reputation: 4877
Based on https://stackoverflow.com/a/3510879/15603477 answer. Minor optimization.
ps aux | grep 'python csp_build.py' | head -1 | tr -s ' ' | cut -d " " -f 2 | xargs kill
By using tr -s ' '
to squeeze multi whitespaces (if have) to 1 white space.
In case you encountered Operation not permitted
follow this>> https://unix.stackexchange.com/questions/89316/how-to-kill-a-process-that-says-operation-not-permitted-when-attempted
Upvotes: 1
Reputation: 453
Lots of good answers here - I used the answer accepted by the OP. Just adding a small caveat note about pkill
and pgrep
. As you might see from their manual pages, on your OS, some OS's have a 15-character limit on the process name. The -f
option gets around that on my OS, but I was in trouble until I found that option!
Upvotes: 6
Reputation: 14527
The solution would be filtering the processes with exact pattern , parse the pid, and construct an argument list for executing kill processes:
ps -ef | grep -e <serviceNameA> -e <serviceNameB> -e <serviceNameC> |
awk '{print $2}' | xargs sudo kill -9
Explanation from documenation:
ps utility displays a header line, followed by lines containing information about all of your processes that have controlling terminals.
-e Display information about other users' processes, including those
-f Display the uid, pid, parent pid, recent CPU usage, process start
The grep utility searches any given input files, selecting lines that
-e pattern, --regexp=pattern Specify a pattern used during the search of the input: an input line is selected if it matches any of the specified patterns. This option is most useful when multiple -e options are used to specify multiple patterns, or when a pattern begins with a dash (`-').
xargs - construct argument list(s) and execute utility
kill - terminate or signal a process
number 9 signal - KILL (non-catchable, non-ignorable kill)
Example:
ps -ef | grep -e node -e loggerUploadService.sh -e applicationService.js |
awk '{print $2}' | xargs sudo kill -9
Upvotes: 9
Reputation: 70977
-C
flag of ps
command-C cmdlist Select by command name. This selects the processes whose executable name is given in cmdlist.
So if you run your script by standard shebang and calling them by his name:
/path/to/csp_build.py
You may find them whith
ps -C csp_build.py
So
kill $(ps -C csp_build.py ho pid)
may be enough.
A little more strong, but still a lot quicker than most other answer in this SO question...
If you don't know ho this is run, or if you run them by
python csp_build.py
python3 csp_build.py
python /path/to/csp_build.py
You may find them by running:
ps -C python,python3,csp_build.py who pid,cmd | grep csp_build.py
Then using sed
:
kill $(ps -C python,python3,csp_build.py who pid,cmd |
sed -ne '/csp_build.py/s/^ *\([0-9]\+\) .*$/\1/p')
Upvotes: 1
Reputation: 3710
If pkill -f csp_build.py
doesn't kill the process you can add -9
to send a kill signall which will not be ignored. i.e. pkill -9 -f csp_build.py
Upvotes: 1
Reputation: 543
This will return the pid only
pgrep -f 'process_name'
So to kill any process in one line:
kill -9 $(pgrep -f 'process_name')
or, if you know the exact name of the process you can also try pidof:
kill -9 $(pidof 'process_name')
But, if you do not know the exact name of the process, pgrep
would be better.
If there is multiple process running with the same name, and you want to kill the first one then:
kill -9 $(pgrep -f 'process_name' | head -1)
Also to note that, if you are worried about case sensitivity then you can add -i option just like in grep. For example:
kill -9 $(pgrep -fi chrome)
More info about signals and pgrep at man 7 signal
or man signal
and man pgrep
Upvotes: 22
Reputation: 5661
ps aux | grep -i csp_build | awk '{print $2}' | xargs sudo kill -9
awk '{print $2}'
sudo
is optionalkill -9 5124
, kill -9 5373
etc (kill -15 is more graceful but slightly slower)I also have 2 shortcut functions defined in my .bash_profile (~/.bash_profile is for osx, you have to see what works for your *nix machine).
p csp_build
, p python
etcbash_profile code:
# FIND PROCESS
function p(){
ps aux | grep -i $1 | grep -v grep
}
ka csp_build
, ka python
etcka csp_build 15
, ka python 9
bash_profile code:
# KILL ALL
function ka(){
cnt=$( p $1 | wc -l) # total count of processes found
klevel=${2:-15} # kill level, defaults to 15 if argument 2 is empty
echo -e "\nSearching for '$1' -- Found" $cnt "Running Processes .. "
p $1
echo -e '\nTerminating' $cnt 'processes .. '
ps aux | grep -i $1 | grep -v grep | awk '{print $2}' | xargs sudo kill -klevel
echo -e "Done!\n"
echo "Running search again:"
p "$1"
echo -e "\n"
}
Upvotes: 124
Reputation: 59
To kill process by keyword midori
, for example:
kill -SIGTERM $(pgrep -i midori)
Upvotes: 5
Reputation: 2006
My task was kill everything matching regexp that is placed in specific directory (after selenium tests not everything got stop). This worked for me:
for i in `ps aux | egrep "firefox|chrome|selenium|opera"|grep "/home/dir1/dir2"|awk '{print $2}'|uniq`; do kill $i; done
Upvotes: 6
Reputation: 13474
Find and kill all the processes in one line in bash.
kill -9 $(ps -ef | grep '<exe_name>' | grep -v 'grep' | awk {'print $2'})
ps -ef | grep '<exe_name>'
- Gives the list of running process details (uname, pid, etc ) which matches the pattern. Output list includes this grep
command also which searches it. Now for killing we need to ignore this grep
command process.ps -ef | grep '<exec_name>' | grep -v 'grep'
- Adding another grep with -v 'grep'
removes the current grep process.awk
get the process id alone.$(...)
and pass it to kill
command, to kill all process.Upvotes: 1
Reputation: 353
The following command will come handy:
kill $(ps -elf | grep <process_regex>| awk {'print $4'})
eg.,
ps -elf | grep top
0 T ubuntu 6558 6535 0 80 0 - 4001 signal 11:32 pts/1 00:00:00 top
0 S ubuntu 6562 6535 0 80 0 - 2939 pipe_w 11:33 pts/1 00:00:00 grep --color=auto top
kill -$(ps -elf | grep top| awk {'print $4'})
-bash: kill: (6572) - No such process
[1]+ Killed top
If the process is still stuck, use "-9" extension to hardkill, as follows:
kill -9 $(ps -elf | grep top| awk {'print $4'})
Hope that helps...!
Upvotes: -1
Reputation: 836
Use pgrep - available on many platforms:
kill -9 `pgrep -f cps_build`
pgrep -f will return all PIDs with coincidence "cps_build"
Upvotes: 11
Reputation: 109
I started using something like this:
kill $(pgrep 'python csp_build.py')
Upvotes: 2
Reputation: 342869
if you have pkill,
pkill -f csp_build.py
If you only want to grep against the process name (instead of the full argument list) then leave off -f
.
Upvotes: 189
Reputation: 11
In some cases, I'd like kill processes simutaneously like this way:
➜ ~ sleep 1000 & [1] 25410 ➜ ~ sleep 1000 & [2] 25415 ➜ ~ sleep 1000 & [3] 25421 ➜ ~ pidof sleep 25421 25415 25410 ➜ ~ kill `pidof sleep` [2] - 25415 terminated sleep 1000 [1] - 25410 terminated sleep 1000 [3] + 25421 terminated sleep 1000
But, I think it is a little bit inappropriate in your case.(May be there are running python a, python b, python x...in the background.)
Upvotes: 1
Reputation: 5191
I use gkill processname
, where gkill is the following script:
cnt=`ps aux|grep $1| grep -v "grep" -c`
if [ "$cnt" -gt 0 ]
then
echo "Found $cnt processes - killing them"
ps aux|grep $1| grep -v "grep"| awk '{print $2}'| xargs kill
else
echo "No processes found"
fi
NOTE: it will NOT kill processes that have "grep" in their command lines.
Upvotes: 0
Reputation: 189
Give -f to pkill
pkill -f /usr/local/bin/fritzcap.py
exact path of .py file is
# ps ax | grep fritzcap.py
3076 pts/1 Sl 0:00 python -u /usr/local/bin/fritzcap.py -c -d -m
Upvotes: 3
Reputation: 125
I use this to kill Firefox when it's being script slammed and cpu bashing :) Replace 'Firefox' with the app you want to die. I'm on the Bash shell - OS X 10.9.3 Darwin.
kill -Hup $(ps ux | grep Firefox | awk 'NR == 1 {next} {print $2}' | uniq | sort)
Upvotes: 0
Reputation: 18306
You don't need the user switch for ps.
kill `ps ax | grep 'python csp_build.py' | awk '{print $1}'`
Upvotes: 1
Reputation: 14965
Kill our own processes started from a common PPID is quite frequently, pkill associated to the –P
flag is a winner for me. Using @ghostdog74 example :
# sleep 30 &
[1] 68849
# sleep 30 &
[2] 68879
# sleep 30 &
[3] 68897
# sleep 30 &
[4] 68900
# pkill -P $$
[1] Terminated sleep 30
[2] Terminated sleep 30
[3]- Terminated sleep 30
[4]+ Terminated sleep 30
Upvotes: 0
Reputation: 690
killall -r regexp
-r, --regexp
Interpret process name pattern as an extended regular expression.
Upvotes: 27
Reputation: 1876
Try using
ps aux | grep 'python csp_build.py' | head -1 | cut -d " " -f 2 | xargs kill
Upvotes: 16
Reputation: 2662
You may use only pkill '^python*'
for regex process killing.
If you want to see what you gonna kill or find before killing just use pgrep -l '^python*'
where -l outputs also name of the process. If you don't want to use
pkill
, use just:
pgrep '^python*' | xargs kill
Upvotes: 13
Reputation: 67291
ps -o uid,pid,cmd|awk '{if($1=="username" && $3=="your command") print $2}'|xargs kill -15
Upvotes: 4