【问题标题】:Killing all python scripts except one python script and the grep process杀死除一个 python 脚本和 grep 进程之外的所有 python 脚本
【发布时间】:2017-01-25 12:56:17
【问题描述】:

我如何在 bash 中运行命令来杀死除名为 test.py 的脚本和 grep 的 pid 本身之外的所有 python 脚本,以防我们使用类似 ps -ef |grep 的东西

我想我可以使用 pgrep python 之类的东西来忽略 grep 进程,但我如何也排除 test.py 脚本?我知道有一个选项可以执行 grep -v,是否有选项可以执行 pgrep -v

澄清:除了 grep 进程-意味着当我们执行例如 ps -ef |grep test1.py 时,我们还会获得用于带来此结果的 grep pid。我不想杀死它,因为在显示结果的阶段不再存在这个过程。

编辑: 我需要此命令通过 python 的 subprocess 模块有效
k = subprocess.Popen('[some_bash_cmd_here]',shell=True)
k.wait()

【问题讨论】:

    标签: linux bash python-2.7 shell centos


    【解决方案1】:

    您可以使用pgrep -fl python 获取与python 匹配的所有命令,然后使用awk 通过从命令中排除test.py 来获取进程ID,最后将其通过管道传递给xargs kill

    pgrep -fl python | awk '!/test\.py/{print $1}' | xargs kill
    

    【讨论】:

    • 要获取最近的pgreps 中的参数,您不需要使用-fa 而不是-fl 吗?至少 RHEL 7 是这样,最近的 Fedora 年份也是如此
    • 实际上我不知道最新的pgrep,因为我在 OSX 上并且通过home brew 安装了另一个pkill,它们都不支持-a
    • 非常感谢,现在我尝试通过 gitlab-ci 启动这个脚本,它可以运行 python 脚本。在 test.py 中,我执行您在以下代码中编写的以下操作:k = subprocess.Popen(bash_cmd,shell=True) k.wait()
    • 我得到返回码 -15,而在没有 python 的情况下在 bash 上手动启动确切命令就像一个魅力,你知道 python 子进程的 -15 返回码是什么,我该如何修复是吗?
    • 返回码15表示单单#15即SIGTERM。您可以在 unix shell 中使用kill -l 命令检查信号名称。
    【解决方案2】:

    更好的方法是在 Python 本身中进行过滤,您可以轻松地保持状态等。

    import subprocess, os
    for proc in subprocess.check_output(['ps', '-ef']).split('\n'):   # ps options depend on your OS
        if 'python' in proc and 'test.py' not in proc:
            os.kill(proc)
    

    【讨论】:

      【解决方案3】:

      使用 Python 3 和 PID 对 anubhava 和 Tripleee 方法进行了一些修改。

      anubhava 方法(使用 PID 而不是脚本名称):

      import os
      from subprocess import Popen
      
      pid = os.getpid()
      command=f"pgrep -fl python | awk '!/{pid}/{{print $1}}' | xargs kill"
      result = Popen(command, shell=True)
      

      tripleee 方法(使用 PID):

      import subprocess, os, signal
      
      pid = os.getpid()
      for proc in subprocess.check_output(['ps', '-ef']).decode().split('\n'):   # ps options depend on your OS
          if 'python' in proc:
              current_pid = int(proc.split()[1])
              if current_pid != pid:
                  try:
                      os.kill(current_pid, signal.SIGSTOP)
                      print("Killed: ", proc)
                  except:
                      print("Couldn't kill: ", proc)
      

      如果您确实想使用脚本名称,您也可以动态地这样做:

      from pathlib import Path
      script_name = Path(__file__).name
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-05-02
        • 1970-01-01
        • 1970-01-01
        • 2019-06-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多