Как проверить, работает ли SAP Server с python - PullRequest
0 голосов
/ 21 октября 2019

Я использую SAP GUI сценарии для автоматизации SAP. Эти vb-скрипты вызываются с помощью следующей команды:

subprocess.call("cmd /c  .\\VBScripts\\Login.vbs " + '"' + username + '" ' + '"' + password + '"')

Но, когда скрипт вызывается, когда окно сервера не запускается, скрипт останавливается с всплывающим окном. Поэтому мне нужно проверить, установлено ли соединение с конкретным сервером SAP с использованием python.

Решил проверить, есть ли задача SAP (выделена на рисунке) в списке процессов. Но я не могу перечислить эти подпроцессы, используя python.

Оцените, если кто-то может помочь с выше. Или же предложите лучший способ справиться с описанным выше сценарием.

enter image description here

1 Ответ

0 голосов
/ 21 октября 2019

Чтобы решить проблему, которую вы указали (перечислить все процессы с определенной строкой в ​​командной строке, запускающей их), я использую 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)

Некоторые ограничения для этого кода:

  1. Он найдет только процессы, запущенные или принадлежащие запущенному пользователю. Поэтому запустите от имени администратора, чтобы получить их все.
  2. Вам потребуется получить точную строку командной строки, запускающую процесс SAP. Если это не уникально, приведенный выше код не будет делать то, что вам нужно.
  3. Код создан для работы с хостами Linux и Windows, просто установите targ на win или удалите аргумент илогика для Linux, если они вам не нужны.
  4. Чтобы получить точную командную строку вашего процесса SAP, откройте Диспетчер задач, выберите Сведения, щелкните правой кнопкой мыши заголовок столбца Имя и выберите Select Columns, затем отметьте Command Line и нажмите ОК. Все процессы вашего пользователя теперь также должны отображать аргумент командной строки.
  5. Командная строка в моем случае уникальна, но если у вашего процесса есть какая-то другая определяющая характеристика, вы можете использовать ее в качестве фильтра, поэтому вместо ProcessId,CommandLine используйте атрибут, который делает ваш процессуникальный (например, Имя или Описание).
  6. Код был написан для Python 2.7, но должен работать на 3, если вы удалите / переписать все операторы печати. ​​

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...