簡體   English   中英

殺死除一個 python 腳本和 grep 進程之外的所有 python 腳本

[英]Killing all python scripts except one python script and the grep process

我如何在 bash 中運行命令來殺死所有 python 腳本,除了名為test.py腳本和 grep 的 pid 本身,以防我們使用類似ps -ef |grep東西

我想我可以使用pgrep python 之類的東西來忽略 grep 進程,但是我該如何排除test.py腳本? 我知道有一個選項可以做 grep -v,有沒有選項可以做pgrep -v

說明:除了 grep process- 意味着當我們執行例如ps -ef |grep test1.py我們還會得到用於帶來此結果的 grep pid。 我不想殺死它,因為在顯示結果的階段不再存在此過程。

編輯:我需要這個命令通過 python 的subprocess模塊有效
k = subprocess.Popen('[some_bash_cmd_here]',shell=True)
k.wait()

您可以使用pgrep -fl python獲取與python匹配的所有命令,然后通過從命令中排除test.py將其與awk進行管道傳輸以獲取進程 ID,最后將其通過管道傳輸到xargs kill

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

更好的方法是在 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)

使用 Python 3 和 PID 對 anubhava 和三元組方法進行了一些修改。

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)

三重法(使用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM