Как заставить программу закрывать запущенный экземпляр при запуске? - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть программа командной строки, которую я хотел бы продолжать до тех пор, пока я не открою ее, поэтому в основном это программа, которая сначала проверяет, есть ли уже какой-либо уже запущенный экземпляр, и уничтожает его.

Iпопробовал os.system('TASKKILL /F /IM program.exe') но оказалось глупо потому что тоже убивает себя.

Ответы [ 4 ]

0 голосов
/ 23 сентября 2018

Поскольку мои рабочие станции не имеют доступа к Интернету, а установка пакетов - беспорядок, я в итоге пришел к такому решению:

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')

Он выводит вывод команды tasklist в файли затем проверяет файл, чтобы увидеть, есть ли запущенный процесс Python с другим PID, отличным от его собственного.

edit: выяснил, что я могу сделать это с 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
0 голосов
/ 20 сентября 2018

Самый надежный способ убедиться, что существует только один экземпляр вашего приложения, - это создать файл pid в известном (фиксированном) месте.Это местоположение обычно находится в папке данных вашего приложения или во временном каталоге.При запуске вы должны проверить, существует ли pid-файл и существует ли pid, содержащийся там, по-прежнему и относится ли он к вашему целевому процессу.Если он существует, отправьте ему сигнал уничтожения, а затем перезапустите файл с текущим pid, прежде чем запускать остальную часть приложения.

Для дополнительной безопасности вы можете подождать, пока предыдущий процесс полностью не завершится.Это можно сделать либо ожиданием / опросом, чтобы проверить, существует ли еще процесс с этим pid, либо опросом убитого процесса, чтобы удалить его собственный файл pid.Последнее может быть необходимо, если завершение процесса очень длительное и вы хотите, чтобы текущий процесс уже начал работать, пока старый процесс завершает работу.

0 голосов
/ 20 сентября 2018

Вы можете использовать библиотеку 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:
         # ...
0 голосов
/ 20 сентября 2018

Вы можете использовать идентификатор процесса уже запущенного экземпляра.

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