使用bash和regex在一行中查找并终止进程

Find and kill a process in one line using bash and regex

我经常需要在编程过程中终止一个进程。

我现在的做法是:

1
2
3
4
[~]$ 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

如何自动提取进程ID并在同一行中终止它?

这样地:

1
[~]$ ps aux | grep 'python csp_build.py' | kill <regex that returns the pid>


bash中,您应该能够做到:

1
kill $(ps aux | grep '[p]ython csp_build.py' | awk '{print $2}')

其工作细节如下:

  • ps为您提供了所有进程的列表。
  • grep过滤器基于您的搜索字符串,
    是一个阻止您选择实际grep进程本身的技巧。
  • awk只提供了每行的第二个字段,即pid。
  • $(x)构造是指执行x然后获取其输出并将其放到命令行上。上面构造中的ps管道的输出是进程ID列表,因此您最终得到一个类似于kill 1234 1122 7654的命令。

这是一份在实际行动中显示它的记录:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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

你可以看到它终止了所有的睡眠。

更详细地解释grep '

ython csp_build.py'位:

当你做sleep 3600 &,然后是ps -ef | grep sleep,你会得到两个进程,其中有sleepsleep 3600grep sleep(因为它们都有sleep,这不是火箭科学)。

但是,ps -ef | grep '▼显示leep'不会创建一个包含sleep的进程,而是创建grep '▼显示leep',这里有一个棘手的问题:grep找不到它,因为它在寻找"▼显示字符类中的任何字符(即s字符),然后是leep字符"的正则表达式。

换言之,它在寻找sleep,但grep过程是grep '▼显示leep',其中没有sleep

当我(在这上面的某人)看到这个时,我立即开始使用它,因为

  • 这比添加| grep -v grep要少一个过程;
  • 它优雅而鬼鬼祟祟,是一种罕见的组合——)


如果你有pkill,

1
pkill -f csp_build.py

如果您只想对进程名(而不是完整的参数列表)进行grep,那么就不要使用-f


一班轮:

ps aux | grep -i csp_build | awk '{print $2}' | xargs sudo kill -9

  • 打印列2:awk '{print $2}'
  • sudo是可选的
  • 运行kill -9 5124kill -9 5373等(kill-15更优雅,但稍慢)

奖金:

我的.bash_配置文件中还定义了两个快捷函数(~/.bash_profile是针对OSX的,您必须查看什么适用于您的*nix机器)。

  • P关键字
    • 列出包含关键字的所有进程
    • 用途如:p csp_buildp python
  • Bash_配置文件代码:

    1
    2
    3
    4
    # FIND PROCESS
    function p(){
            ps aux | grep -i $1 | grep -v grep
    }
  • KA关键字
    • 终止具有此关键字的所有进程
    • 用途如:ka csp_buildka python
    • 可选的杀伤水平,如:ka csp_build 15ka python 9
  • Bash_配置文件代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    # 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"
    Searching for '$1' -- Found"
    $cnt"Running Processes .."
        p $1

        echo -e '
    Terminating'
    $cnt 'processes .. '

        ps aux  |  grep -i $1 |  grep -v grep   | awk '{print $2}' | xargs sudo kill -klevel
        echo -e"Done!
    "


        echo"Running search again:"
        p"$1"
        echo -e"
    "

    }


    试用使用

    1
    ps aux | grep 'python csp_build.py' | head -1 | cut -d"" -f 2 | xargs kill


    1
    2
    3
    killall -r regexp

    -r, --regexp

    将进程名模式解释为扩展正则表达式。


    您只能使用pkill '^python*'来杀死regex进程。

    如果你想在杀死之前看到你要杀死或发现什么,只需使用pgrep -l '^python*',其中-l还输出进程的名称。如果你不想使用pkill,仅使用:

    pgrep '^python*' | xargs kill


    使用PGrep-可在许多平台上使用:

    1
    kill -9 `pgrep -f cps_build`

    pgrep-f将返回所有符合"cps_build"的pid。


    通过关键字midori终止进程,例如:

    kill -SIGTERM $(pgrep -i midori)


    你可以用awk和backtics来做

    1
    ps auxf |grep 'python csp_build.py'|`awk '{ print"kill" $2 }'`

    awk中的$2打印第2列,backtics运行打印的语句。

    但是对于python进程来说,一个更干净的解决方案是将其进程ID存储在/var/run中,然后您可以简单地读取该文件并杀死它。


    我的任务是杀死所有与放在特定目录中的regexp匹配的东西(在Selenium测试之后,并不是所有东西都停止了)。这对我很有用:

    1
    for i in `ps aux | egrep"firefox|chrome|selenium|opera"|grep"/home/dir1/dir2"|awk '{print $2}'|uniq`; do kill $i; done


    仅使用awkps的方法:

    1
    ps aux | awk '$11""$12 =="python csp_build.py" { system("kill" $2) }'

    通过使用字符串相等性测试,我将阻止匹配此进程本身。


    1
    ps -o uid,pid,cmd|awk '{if($1=="username" && $3=="your command") print $2}'|xargs kill -15


    把-f给pkill

    1
    pkill -f /usr/local/bin/fritzcap.py

    .py文件的确切路径是

    1
    2
    # ps ax | grep fritzcap.py
     3076 pts/1    Sl     0:00 python -u /usr/local/bin/fritzcap.py -c -d -m

    我开始用这样的东西:

    1
    kill $(pgrep 'python csp_build.py')


    杀戮我们自己的过程从一个普通的PPID开始是相当频繁的,与–P标志相关的pkill是我的赢家。使用@ghostdog74示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # 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

    你不需要PS的用户开关。

    1
    kill `ps ax | grep 'python csp_build.py' | awk '{print $1}'`

    在某些情况下,我希望以这种方式同时终止进程:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    ?  ~  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

    但是,我认为这在您的情况下有点不合适(可能在后台运行的是python a、python b、python x…)。


    这将只返回PID

    1
    pgrep -f 'process_name'

    因此,要杀死一行中的任何进程:

    1
    kill -9 $(pgrep -f 'process_name')

    或者,如果您知道进程的确切名称,也可以尝试pidof:

    1
    kill -9 $(pidof 'process_name')

    但是,如果你不知道进程的确切名称,那么pgrep会更好。

    如果有多个进程以相同的名称运行,并且您希望杀死第一个进程,那么:

    1
    kill -9 $(pgrep -f 'process_name' | head -1)

    另外要注意的是,如果您担心区分大小写,那么您可以像grep中那样添加-i选项。例如:

    1
    kill -9 $(pgrep -fi chrome)

    关于man 7 signalman signalman pgrep的信号和pgrep的更多信息


    我使用gkill processname,其中gkill是以下脚本:

    1
    2
    3
    4
    5
    6
    7
    8
    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

    注意:它不会杀死命令行中有"grep"的进程。


    我用这个来杀死firefox,当它被脚本猛击和CPU攻击时:)将"firefox"替换为你想死的应用程序。我在Bash Shell上—OS X 10.9.3达尔文。

    kill -Hup $(ps ux | grep Firefox | awk 'NR == 1 {next} {print $2}' | uniq | sort)


    以下命令将派上用场:

    kill $(ps -elf | grep | awk {'print $4'})

    如。,ps -elf | grep top

    1
    2
        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'})

    1
    2
        -bash: kill: (6572) - No such process
        [1]+  Killed                  top

    如果该过程仍被卡住,则使用"-9"扩展到Hardkill,如下所示:

    kill -9 $(ps -elf | grep top| awk {'print $4'})

    希望能有帮助…!


    在bash的一行中查找并杀死所有进程。

    1
    kill -9 $(ps -ef | grep '<exe_name>' | grep -v 'grep' | awk {'print $2'})
    • ps -ef | grep ''—提供与模式匹配的运行进程详细信息(uname、pid等)列表。输出列表还包括搜索它的grep命令。现在,为了杀戮,我们需要忽略这个grep命令过程。
    • ps -ef | grep '' | grep -v 'grep'—在-v 'grep'中添加另一个grep将删除当前grep过程。
    • 然后使用awk单独获取进程ID。
    • 然后把这个命令保存在$(...)中,传递给kill命令,杀死所有进程。

    可以使用下面的命令列出命令的PID。使用top或更好的方法使用htop查看Linux中的所有进程。在这里我想杀死一个名为

    1
    ps -ef | grep '/usr/lib/something somelocation/some_process.js'  | grep -v grep | awk '{print $2}'

    并验证PID。必须是正确的。要杀死他们,使用kill命令。

    1
    sudo kill -9 `ps -ef | grep '/usr/lib/something somelocation/some_process.js'  | grep -v grep | awk '{print $2}'`

    例如:来自HTOP进程列表。

    1
    sudo kill -9 `ps -ef | grep '<process>'  | grep -v grep | awk '{print $2}'`

    这解决了我的问题。如果意外地终止了进程,请始终准备重新启动进程。