首页 文章

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

提问于
浏览
524

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

我现在这样做的方式是:

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

22 回答

  • 4

    尝试使用

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

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

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

    我开始使用这样的东西:

    kill $(pgrep 'python csp_build.py')
    
  • 5

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

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

    pgrep '^python*' | xargs kill

  • 3

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

    kill -9 `pgrep -f cps_build`
    

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

  • 9

    一个班轮:

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

    • p 关键字

    • 列出了包含关键字的所有 P rocesses

    • 用法例如: p csp_buildp python

    bash_profile代码:

    # FIND PROCESS
    function p(){
            ps aux | grep -i $1 | grep -v grep
    }
    
    • ka 关键字

    • K ills A ll具有此关键字的进程

    • 用法例如: 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"
    }
    
  • 5

    如果你有pkill,

    pkill -f csp_build.py
    

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

  • 0

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

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

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

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

  • -1

    我使用 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”的进程 .

  • 3

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

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

  • 5

    您可以使用以下命令列出命令的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}'`
    

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

  • 1

    ps不需要用户开关 .

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

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

    kill -SIGTERM $(pgrep -i midori)

  • 2

    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 少一个过程;和

    • 优雅而偷偷摸摸,罕见的组合:-)

  • 107

    杀死我们自己的进程从一个常见的 PPID 开始是非常频繁的 pkill 关联到 –P 标志是我的赢家 . 使用@ 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
    
  • 65
    ps -o uid,pid,cmd|awk '{if($1=="username" && $3=="your command") print $2}'|xargs kill -15
    
  • 1156

    把-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
    
  • 1
    killall -r regexp
    
    -r, --regexp
    

    将进程名称模式解释为扩展常规表达 .

  • 14

    我用这个来杀死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)

  • 0

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

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

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

  • 11

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

  • 0

    以下命令将派上用场:

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

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

相关问题