我有问题。我需要使用驻留在同一批处理文件中的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 该脚本检查是否存在另一个正在运行的脚本,然后需要终止自身。
答案 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
从任何进程转到其父进程。然后,您可以使用kill
或terminate
proc = psutil.Process().parent()
proc.kill()
除了使用CTRL_C_EVENT
或CTRL_BREAK_EVENT
而不是标准信号以外,上述所有方法都具有跨平台的优点-您可以在Linux或macOS或任何其他操作系统上运行相同的脚本它将杀死运行它的shell脚本。
答案 1 :(得分:1)
您的批处理文件将需要检查最后一个命令是否成功,如果没有成功则退出。
请参见How do I make a batch file terminate upon encountering an error?