Чтобы решить проблему, которую вы указали (перечислить все процессы с определенной строкой в командной строке, запускающей их), я использую wmic
с аргументами PID и CommandLine, затем отфильтрую нужную строку командной строки и получу ее PID. Ниже я прилагаю фрагмент, который делает поиск. Также функция убить их.
def get_running_processes(targ, name):
pids = []
if targ == 'win':
cmd = "WMIC PROCESS get ProcessId,CommandLine"
else:
cmd = "ps a"
proc = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
for line in proc.stdout:
if name in line:
if targ == 'win':
pid = line.strip().split()[-1]
else:
pid = line.strip().split()[0]
pids.append(pid)
if len(pids):
print 'Found following pids for', name
print [_ for _ in pids]
else:
print 'No processes with', name, 'detected running for this user'
return pids
def kill_prev_instances(targ, pids):
for _ in pids:
if targ == 'win':
kill_cmd = ['wmic', 'process', 'where', 'processid=' + str(_), 'call', 'terminate']
else:
kill_cmd = ['kill', '-9', str(_)]
print 'Killing pid ' + str(_)
subprocess.check_call(kill_cmd, shell=False)
time.sleep(2)
Некоторые ограничения для этого кода:
- Он найдет только процессы, запущенные или принадлежащие запущенному пользователю. Поэтому запустите от имени администратора, чтобы получить их все.
- Вам потребуется получить точную строку командной строки, запускающую процесс SAP. Если это не уникально, приведенный выше код не будет делать то, что вам нужно.
- Код создан для работы с хостами Linux и Windows, просто установите targ на
win
или удалите аргумент илогика для Linux, если они вам не нужны. - Чтобы получить точную командную строку вашего процесса SAP, откройте Диспетчер задач, выберите Сведения, щелкните правой кнопкой мыши заголовок столбца Имя и выберите
Select Columns
, затем отметьте Command Line
и нажмите ОК. Все процессы вашего пользователя теперь также должны отображать аргумент командной строки. - Командная строка в моем случае уникальна, но если у вашего процесса есть какая-то другая определяющая характеристика, вы можете использовать ее в качестве фильтра, поэтому вместо
ProcessId,CommandLine
используйте атрибут, который делает ваш процессуникальный (например, Имя или Описание). - Код был написан для Python 2.7, но должен работать на 3, если вы удалите / переписать все операторы печати.
При этом,просто проверка процесса с запущенной командной строкой / именем и т. д. не гарантирует, что этот процесс работает правильно и может принимать запросы на вход в систему. Для этого я бы попытался использовать модуль Python, который поддерживает соединения SAP. Посмотрите решения, приведенные в этой теме для получения более подробной информации. Может ли SAP работать с Python?