我经常需要在编程期间终止一个进程。

我现在的做法是:

[~]$ 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>

当前回答

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

➜  ~  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…在背景中。)

其他回答

一个衬套:

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

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


奖金:

我还在.bash_profile中定义了2个快捷函数 (~ /。Bash_profile是用于osx的,你必须看看什么适用于你的*nix机器)。

p关键字 列出所有包含关键字的进程 用法例如:p csp_build, p python等

bash_profile代码:

# FIND PROCESS
function p(){
        ps aux | grep -i $1 | grep -v grep
}

ka关键字 杀死所有具有此关键字的进程 用法例如:ka csp_build, ka python等 可选的kill级别,例如:ka csp_build 15, ka 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"
}

这将只返回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)

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

你可以用awk和backtics来做

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

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

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

如果你想主要在awk中完成,试试吧

  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 ]'; )

解决方案是用精确的模式过滤进程,解析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 pattern,——regexp=pattern 指定搜索输入期间使用的模式:输入 如果匹配任何指定的模式,则选择该行。 当使用多个-e选项时,此选项最有用 指定多个模式,或者当一个模式以破折号开始时 (“-”)。

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

终止—终止进程或给进程发信号

9号信号- KILL(不可捕捉,不可忽略的杀死)

例子:

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