杀死其中包含python脚本的批处理文件

时间:2018-08-21 06:20:42

标签: python batch-file kill

我有问题。我需要使用驻留在同一批处理文件中的python脚本杀死该批处理文件。批处理文件的第一个文件具有 abc.py 脚本以及其他脚本。因此,我需要杀死该批处理文件,以免其他人被执行。这是我尝试过的:

for proc in psutil.process_iter():
     if proc.name() == "python.exe" and len(proc.cmdline()) > 1 and 
         "abc.py" in proc.cmdline()[1]:
    proc.terminate()

但这只会杀死python脚本,而不杀死批处理文件。试图杀死pid具有相同的效果。

os.system("taskkill /F /PID " + str(os.getpid()))

编辑1 该脚本检查是否存在另一个正在运行的脚本,然后需要终止自身。

2 个答案:

答案 0 :(得分:3)

如果您想杀死父母中的任何一个,那很容易:只需使用os.getppid()而不是os.getpid()

os.system("taskkill /F /PID " + str(os.getppid()))

当然,出于所有常见原因,最好使用subprocess而不是os.system,例如在失败时出现有用的错误:

subprocess.run(['taskkill', '/F', '/PID', str(os.getppid())])

或者更好的是,不要直接使用taskkill,而只是kill。如果愿意的话,这也使您可以选择使用更好的Ctrl-C or Ctrl-Break杀死而不是硬杀死(

):

os.kill(os.getppid(), signal.CTRL_BREAK_EVENT)

如果您使用的是Python 2.7,则getppid在Windows上不起作用;仅在3.2中添加。 (我认为os.kill也是这样,signal.CTRL_BREAK_EVENT肯定也是。)

由于您显然已经可以使用psutil,因此可以使用它。

无需搜索系统上的每个进程来找到自己,只需构建默认的Process。您可以使用parent从任何进程转到其父进程。然后,您可以使用killterminate

proc = psutil.Process().parent()
proc.kill()

除了使用CTRL_C_EVENTCTRL_BREAK_EVENT而不是标准信号以外,上述所有方法都具有跨平台的优点-您可以在Linux或macOS或任何其他操作系统上运行相同的脚本它将杀死运行它的shell脚本。

答案 1 :(得分:1)

您的批处理文件将需要检查最后一个命令是否成功,如果没有成功则退出。

请参见How do I make a batch file terminate upon encountering an error?