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

时间:2010-08-18 09:33:42

标签: regex bash terminal awk

我经常需要在编程期间杀死进程。

我现在的做法是:

[~]$ 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并在同一行中终止它?

像这样:

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

26 个答案:

答案 0 :(得分:1234)

bash中,你应该可以:

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

有关其运作的详情如下:

  • ps为您提供所有流程的列表。
  • 基于您的搜索字符串grep的{​​{1}}过滤器可以阻止您自己选择实际的[p]进程。
  • grep只会为您提供每行的第二个字段,即PID。
  • awk构造意味着执行$(x)然后获取其输出并将其放在命令行上。上面该构造中的x管道的输出是进程ID列表,因此您最终得到ps之类的命令。

以下是一份显示实际情况的成绩单:

kill 1234 1122 7654

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


更详细地解释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 '[p]ython csp_build.py'后跟sleep 3600 &时,您往往会获得两个带有ps -ef | grep sleep流程,sleep和{ {1}}(因为他们都有sleep 3600,这不是火箭科学。)

但是,grep sleep不会在其中创建包含sleep的流程,而是会创建ps -ef | grep '[s]leep',而这里是棘手的一点:sleep找不到它因为它正在寻找正则表达式“字符类grep '[s]leep'中的任何字符(grep)后跟[s]

换句话说,它正在寻找s,但grep进程为leep,其中没有sleep

当我看到这个(由SO在这里的人)时,我立即开始使用它,因为

  • 比添加grep '[s]leep'少一个过程;和
  • 优雅的偷偷摸摸,一种罕见的组合: - )

答案 1 :(得分:117)

如果你有pkill,

pkill -f csp_build.py

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

答案 2 :(得分:78)

一个班轮:

<强> 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_profile中还定义了2个快捷方式功能 (〜/ .bash_profile用于osx,你必须看看什么对你的* nix机器有效。)

  1. p 关键字
    • 列出包含关键字
    • 的所有 P rocesses
    • 用法例如:p csp_buildp python
  2. bash_profile代码:

    # FIND PROCESS
    function p(){
            ps aux | grep -i $1 | grep -v grep
    }
    
    1. ka 关键字
      • K 错误 A ll包含此关键字的流程
      • 用法例如:ka csp_buildka python
      • 可选的杀戮级别,例如:ka csp_build 15ka python 9
    2. bash_profile代码:

      # 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"
      }
      

答案 3 :(得分:14)

尝试使用

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

答案 4 :(得分:13)

killall -r regexp

-r, --regexp

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

答案 5 :(得分:9)

您只能使用pkill '^python*'进行正则表达式进程查杀。

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

pgrep '^python*' | xargs kill

答案 6 :(得分:6)

使用pgrep - 在许多平台上都可用:

kill -9 `pgrep -f cps_build`

pgrep -f将巧合地返回所有PID&#34; cps_build&#34;

答案 7 :(得分:5)

要按关键字midori终止流程,例如:

kill -SIGTERM $(pgrep -i midori)

答案 8 :(得分:5)

你可以用awk和backtics做到这一点

ps auxf |grep 'python csp_build.py'|`awk '{ print "kill " $2 }'`
awk中的$ 2打印第2列,而backtics运行打印的语句。

但更简洁的解决方案是让python进程在/ var / run中存储它的进程id,然后你就可以简单地读取该文件并将其删除。

答案 9 :(得分:4)

我的任务是杀死与特定目录中的regexp匹配的所有内容(在selenium测试之后并非所有内容都停止)。这对我有用:

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

答案 10 :(得分:3)

仅使用awk(和ps)的方法:

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

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

答案 11 :(得分:3)

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

答案 12 :(得分:3)

将-f提供给pkill

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

.py文件的确切路径是

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

答案 13 :(得分:2)

我开始使用这样的东西:

kill $(pgrep 'python csp_build.py')

答案 14 :(得分:1)

这将仅返回pid

pgrep -f 'process_name'

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

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

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

kill -9 $(pidof 'process_name')

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

如果有多个同名进程运行,并且您想杀死第一个进程,则:

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

还要注意,如果您担心区分大小写,则可以像在grep中一样添加-i选项。例如:

kill -9 $(pgrep -fi chrome)

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

答案 15 :(得分:1)

在某些情况下,我喜欢像这样同时杀死进程:

➜  ~  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 ......)

答案 16 :(得分:1)

解决方案将使用精确模式过滤进程,解析pid并构造用于执行kill进程的参数列表:

ps -ef  | grep -e <serviceNameA> -e <serviceNameB> -e <serviceNameC> |
awk '{print $2}' | xargs sudo kill -9
来自文档的

说明

  

ps 实用程序显示标题行,然后显示包含以下内容的行   有关具有控制终端的所有过程的信息。

     

-e 显示有关其他用户进程(包括那些进程)的信息

     

-f 显示uid,pid,父pid,最近的CPU使用率,进程启动

     

grep 实用程序搜索任何给定的输入文件,并选择要输入的行

     

-e 模式,--regexp = pattern                指定在搜索输入期间使用的模式:输入                如果它匹配任何指定的模式,则选择行。                当使用多个-e选项时,此选项最有用                指定多个模式,或模式以破折号开头                (`-')。

     

xargs -构造参数列表并执行实用程序

     

杀死-终止或发出信号

     

数字 9 信号-杀死(不可捕获,不可忽略的杀戮)

示例

ps -ef  | grep -e node -e loggerUploadService.sh - -e applicationService.js |
awk '{print $2}' | xargs sudo kill -9

答案 17 :(得分:1)

您不需要ps的用户开关。

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

答案 18 :(得分:1)

从常见的 PPID 开始杀死我们自己的流程非常频繁,与–P标志相关联的 pkill 对我来说是一个赢家。使用@ ghostdog74示例:

# 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

答案 19 :(得分:0)

如果pkill -f csp_build.py没有终止进程,则可以添加-9发送终止信号,该信号不会被忽略。即pkill -9 -f csp_build.py

答案 20 :(得分:0)

使用 -C 命令的 ps 标志

<块引用>
-C cmdlist
     Select by command name.  This selects the processes whose
     executable name is given in cmdlist.

第一种情况,简单命令

因此,如果您按标准shebang运行脚本并按他的名字调用它们:

/path/to/csp_build.py

你可能会发现它们

ps -C csp_build.py

所以

kill $(ps -C csp_build.py ho pid)

可能就够了。

第二种情况,搜索cmd

比这个问题中的大多数其他答案要强一点,但仍然要快得多......

如果你不知道这是如何运行的,或者如果你运行它们

python csp_build.py
python3 csp_build.py
python /path/to/csp_build.py

您可以通过运行找到它们:

ps -C python,python3,csp_build.py who pid,cmd | grep csp_build.py

然后使用 sed

kill $(ps -C python,python3,csp_build.py who pid,cmd |
    sed -ne '/csp_build.py/s/^ *\([0-9]\+\) .*$/\1/p')

答案 21 :(得分:0)

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

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”的进程。

答案 22 :(得分:0)

我用这个来杀死Firefox,当它被脚本抨击和cpu抨击:) 将'Firefox'替换为您想要死的应用程序。我在Bash shell上 - OS X 10.9.3 Darwin。

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

答案 23 :(得分:-1)

您可以使用以下命令列出命令的pid。使用top或更好的使用htop来查看linux中的所有进程。在这里,我想杀死一个名为

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

验证pid。它必须是正确的。要杀死它们使用kill命令。

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

例如: - 来自htop进程列表。

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

这解决了我的问题。如果您不小心杀死了某个进程,请随时准备重启进程。

答案 24 :(得分:-1)

在bash中查找并删除一行中的所有进程。

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

答案 25 :(得分:-1)

以下命令将派上用场:

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

例如, 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

如果进程仍然卡住,请使用&#34; -9&#34;扩展到hardkill,如下:

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

希望有帮助......!