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

问题描述 投票:554回答:23

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

我现在这样做的方式是:

[~]$ 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>
regex bash terminal awk
23个回答
1246
投票

bash,你应该能够做到:

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

有关其运作的详情如下:

  • ps为您提供所有流程的列表。
  • grep过滤器基于你的搜索字符串,[p]是一个技巧,阻止你拿起实际的grep过程本身。
  • awk只给你每行的第二个字段,即PID。
  • $(x)构造意味着执行x然后获取其输出并将其放在命令行上。上面构造中的ps管道的输出是进程ID列表,因此您最终会得到像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的两个过程,sleep 3600grep sleep(因为他们都有sleep,这不是火箭科学)。

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

换句话说,它正在寻找sleep,但grep过程是grep '[s]leep',其中没有sleep

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

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

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

3
投票

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

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

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


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

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

2
投票

我开始使用这样的东西:

kill $(pgrep 'python csp_build.py')

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

1
投票

ps不需要用户开关。

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

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


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的更多信息


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)


118
投票

如果你有pkill,

pkill -f csp_build.py

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


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


-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

如果进程仍然卡住,请使用“-9”扩展名进行hardkill,如下所示:

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

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


-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命令,以终止所有进程。

-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}'`

这解决了我的问题。如果您不小心杀死进程,请始终准备好重新启动进程。


79
投票

一个班轮:

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 csp_buildp python

bash_profile代码:

# FIND PROCESS
function p(){
        ps aux | grep -i $1 | grep -v grep
}
  1. ka关键字 杀死具有此关键字的所有进程 例如:ka csp_buildka python等 可选的杀戮级别,例如:ka csp_build 15ka python 9

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

14
投票

尝试使用

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

13
投票
killall -r regexp

-r, --regexp

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


9
投票

您可以仅使用pkill '^python*'进行正则表达式进程查杀。

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

pgrep '^python*' | xargs kill


6
投票

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

kill -9 `pgrep -f cps_build`

pgrep -f将返回所有PID重合“cps_build”


5
投票

你可以用awk和反引号来做到这一点

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

awk打印第2列$ 2,反引号运行打印的语句。

但是一个更清晰的解决方案是让python进程在/ var / run中存储它的进程id,然后你可以简单地读取该文件并将其杀死。


5
投票

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

kill -SIGTERM $(pgrep -i midori)

© www.soinside.com 2019 - 2024. All rights reserved.