在linux系统中经常会遇到结束某个进程的情况,一般我们会使用kill、pkill、killall甚至top这样的工具结束进程,但这些工具虽然是结束进程的基本工具,但使用起来要接进程名全名或准确的pid。下文提供的脚本可以结束与指定的进程名称相匹配的任意进程(杀死指定名称的进程),如果匹配的pid有两个及其以上,kill也能处理掉,设计这个功能的工程师实在是太高明了!赞!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<code>#!/bin/bash</code>
<code>pname=$1</code>
<code>puser=$2</code>
<code>if</code> <code>[[ -z $pname ]]; </code><code>then</code>
<code>echo</code> <code>"fatal error, you must assign a process name"</code>
<code>exit</code> <code>1</code>
<code>fi</code>
<code>if</code> <code>[[ </code><code>"$1"</code> <code>== </code><code>"-h"</code> <code>|| </code><code>"$1"</code> <code>== </code><code>"--help"</code> <code>]]; </code><code>then</code>
<code>echo</code> <code>"func: this shell script will find the process you want to kill with signal 9, process name support regular expression with 'grep'\n"</code>
<code>echo</code> <code>"usage: $0 processname\n"</code>
<code>echo</code> <code>"example: $0 run, this will kill all process which match 'run'\n"</code>
<code>exit</code> <code>0</code>
<code>if</code> <code>[[ -z $puser ]]; </code><code>then</code>
<code>puser=root</code>
<code>pid=`</code><code>ps</code> <code>aux | </code><code>grep</code> <code>$pname | </code><code>grep</code> <code>$puser | </code><code>grep</code> <code>-</code><code>v</code> <code>grep</code> <code>| </code><code>awk</code> <code>'{print $2}'</code><code>`</code>
<code>if</code> <code>[[ -z $pid ]]; </code><code>then</code>
<code> </code><code>echo</code> <code>":(, i can not find $pname running by $puser"</code>
<code># there maybe exist bugs refer to $pid have more than one pid, such as 2 or more</code>
<code># so there is a todo to fix it,</code>
<code># but kill utility support kill pids which more than one, :)</code>
<code>kill</code> <code>-9 $pid ></code><code>/dev/null</code> <code>2>&1</code>
<code># eof</code>
<code># because of kill will exit automatically</code>
<code>reval=$?</code>
<code>vpid=`</code><code>ps</code> <code>aux | </code><code>grep</code> <code>$pname | </code><code>grep</code> <code>$puser | </code><code>grep</code> <code>-</code><code>v</code> <code>grep</code> <code>| </code><code>awk</code> <code>'{print $2}'</code><code>`</code>
<code>if</code> <code>[[ -z $vpid && $reval -</code><code>eq</code> <code>0 ]]; </code><code>then</code>
<code> </code><code>echo</code> <code>":(, failed, i can not kill $pname running by $puser, got an error code $reval"</code>
<code>else</code>
<code> </code><code>echo</code> <code>":), successfully,i killed $pname running by $puser"</code>
测试用脚本,此脚本会借助nohup this >/dev/null 2>&1 & 一直运行,this表示你想命名的名字,别忘了chmod +x this。
<code>while</code> <code>:</code>
<code>do</code>
<code>#sleep 2 second</code>
<code>usleep 2000</code>
<code>done</code>
end