【问题标题】:How to check whether SAP Server is running with python如何检查 SAP Server 是否正在使用 python 运行
【发布时间】:2020-02-17 09:22:29
【问题描述】:

我正在使用 SAP GUI 脚本来自动化 SAP。使用以下命令调用这些 vb 脚本。

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

但是,当服务器窗口未启动时调用脚本时,脚本会停止并弹出一个窗口。因此,我需要检查是否有使用 python 建立到特定 SAP 服务器的连接。

决定检查 SAP 任务(图中突出显示)是否列在进程列表中。但是,我无法使用 python 列出这些子进程。

感谢,如果有人可以提供上述帮助。或者,建议一种更好的方法来处理上述情况。

【问题讨论】:

  • 如果您右键单击SAP 子进程,然后单击Go to Details(或类似的东西),有没有办法将会话与其他进程分开?
  • 不,它没有提供这样的选项。只有[切换到、置于前面、最小化、最大化、结束任务]选项。

标签: python process sap rpa


【解决方案1】:

为了解决您突出显示的问题(在启动它们的命令行中列出具有特定字符串的所有进程),我使用带有 PID 和 CommandLine 参数的wmic,然后过滤所需的命令行字符串并获取它的 PID。下面我附上了一个sn-p来做这个发现。还有一个杀死他们的功能。

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 上运行,前提是您删除/重写所有打印语句。

话虽如此,仅使用命令行/名称等检查正在运行的进程并不能保证该进程正常运行并且可以接受登录请求。 为此,我会尝试使用支持 SAP 连接的 Python 模块。有关更多详细信息,请参阅此线程中给出的解决方案。 Can SAP work with Python?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-21
    • 2020-08-03
    • 1970-01-01
    • 2012-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多