代码之家  ›  专栏  ›  技术社区  ›  Yaniv K.

如何使程序在启动时关闭当前正在运行的实例?

  •  0
  • Yaniv K.  · 技术社区  · 8 年前

    我有一个命令行程序,我想一直运行,直到我再次打开它,所以基本上是一个程序,首先检查是否有任何当前已经运行的实例本身,并杀死它。

    os.system('TASKKILL /F /IM program.exe') 但事实证明它是愚蠢的,因为它也会自杀。

    4 回复  |  直到 8 年前
        1
  •  1
  •   Lie Ryan Bryan    8 年前

    为了更安全,您可能需要等到上一个进程完全终止。这可以通过等待/轮询来检查具有该pid的进程是否仍然存在,或者通过轮询被终止的进程来删除它自己的pid文件来实现。如果进程关闭非常长,并且您希望在旧进程关闭时允许当前进程已经开始工作,则后者可能是必需的。

        2
  •  1
  •   David Ferenczy Rogožan Hugo L.M    8 年前

    你可以用 psutil 图书馆。它只需遍历所有正在运行的进程,过滤具有特定文件名的进程,如果这些进程的PID与当前进程不同,那么它就会杀死它们。考虑到您有一个正确的进程文件名,它也可以在任何平台上运行。

    import psutil
    
    process_to_kill = "program.exe"
    
    # get PID of the current process
    my_pid = os.getpid()
    
    # iterate through all running processes
    for p in psutil.process_iter():
        # if it's process we're looking for...
        if p.name() == process_to_kill:
            # and if the process has a different PID than the current process, kill it
            if not p.pid == my_pid:
                p.terminate()
    

    Process.exe()

    process_to_kill = "c:\some\path\program.exe"
    
    for p in psutil.process_iter():
        if p.exe() == process_to_kill:
             # ...
    
        3
  •  0
  •   Yaniv K.    7 年前

    因为我的工作站无法接入互联网,安装软件包也很混乱,我最终想出了这个解决方案:

    import os
    
    os.system('tasklist > location/tasks.txt')
    with open('location/tasks.txt', 'r') as pslist:
        for line in pslist:
            if line.startswith('python.exe'):
                if line.split()[1] != str(os.getpid()):
                    os.system(f'TASKKILL /F /PID {line.split()[1]}')
                    break
    os.remove('location/tasks.txt')
    

    编辑:我想我可以用 popen

    import os
    
    for line in os.popen('tasklist').readlines():
        if line.startswith('python.exe'):
            if line.split()[1] != str(os.getpid()):
                os.system(f'taskkill /F /PID {line.split()[1]}')
                break
    
        4
  •  -1
  •   Dhnesh Dhingra    8 年前

    可以使用已运行实例的进程id。

    import os
    os.system("taskkill /pid <ProcessID>")