python - 如何使用 Python 和 pexpect 在多个 session 中运行 linux 可执行文件

标签 python ubuntu pexpect

我正在运行一个 Ubuntu 18 服务器,并且我有一个接收特定触发器的 Python 脚本。每当满足触发条件时,我想运行一个可执行文件(带有一组基于触发器的参数)。由于最大执行时间为 20 分钟并且正在发生重叠,因此可以执行两个或多个并行执行。
让我们假设 Python 脚本正在运行,并且在时间 t1 触发了触发器。我想像这样执行:./executable param1 param2。可执行文件可以自行停止,或者如果我以某种方式发送 ctrl+c 然后“停止”。无论如何,我希望它在最多 20 分钟后停止。
在时间 t2,触发器再次触发。我想执行 smth 之类的: ./executable param3 param4 而之前的执行可能尚未完成。我再次希望它在最多 20 分钟后停止。
在时间 t3,另一个触发器可能会触发。你知道流程是怎么回事,我希望。
是我需要的吗?我该如何解决这个问题?
提前非常感谢,如果描述不够清楚,我很抱歉。

最佳答案

您始终可以将 child 放在一个列表中,并根据需要与每个 child 互动。这是一个示例(我使用 10 秒而不是 20 分钟):

#!/usr/bin/python3
import pexpect
from datetime import datetime, timedelta
import time

print("Pexpect Children List Example:")
print("Spawning the child processes and adding them to a list...")
children = []
tod = datetime.utcnow()
start_time = datetime.utcnow()
while tod <= start_time + timedelta(seconds=10):
    child = pexpect.spawn("/bin/bash")
    # Always expect after a spawn or send
    child.expect_exact("(venv) ")
    children.append(child)
    time.sleep(2)
    tod = datetime.utcnow()

print("You spawned {0} children.".format(len(children)))

command_output = pexpect.run("/bin/bash -c 'ps aux | grep /bin/bash'")
print(command_output.decode("utf-8"))

print("Interacting with each child...")
for index, c in enumerate(children):
    command = "echo 'This is child {0}'".format(index)
    c.sendline(command)
    # Virtual environment. Expect (venv) instead of ]$
    c.expect_exact("(venv)")
    print(c.before.decode("utf-8").strip())
    c.sendline("ps")
    c.expect_exact("(venv)")
    print(c.before.decode("utf-8"))

print("Closing children...")

for index, c in enumerate(children):
    c.close()
    print("Child[{0}] closed.".format(index))

print("Script complete. Have a nice day.")
输出
Pexpect Children List Example:
Spawning the child processes and adding them to a list...
You spawned 5 children.
me  17004  0.3  0.1 116800  3176 pts/1    Ss+  19:47   0:00 /bin/bash
me  17039  0.2  0.1 116800  3180 pts/2    Ss+  19:47   0:00 /bin/bash
me  17074  0.3  0.1 116800  3172 pts/3    Ss+  19:47   0:00 /bin/bash
me  17118  0.7  0.1 116800  3180 pts/4    Ss+  19:48   0:00 /bin/bash
me  17152  1.0  0.1 116800  3172 pts/5    Ss+  19:48   0:00 /bin/bash
me  17187  0.0  0.0 113280  1200 pts/6    Ss+  19:48   0:00 /bin/bash -c ps aux | grep /bin/bash
me  17189  0.0  0.0 112812   948 pts/6    S+   19:48   0:00 grep /bin/bash

Interacting with each child...
echo 'This is child 0'
This is child 0
 ps
  PID TTY          TIME CMD
17004 pts/1    00:00:00 bash
17190 pts/1    00:00:00 ps

echo 'This is child 1'
This is child 1
 ps
  PID TTY          TIME CMD
17039 pts/2    00:00:00 bash
17191 pts/2    00:00:00 ps

echo 'This is child 2'
This is child 2
 ps
  PID TTY          TIME CMD
17074 pts/3    00:00:00 bash
17192 pts/3    00:00:00 ps

echo 'This is child 3'
This is child 3
 ps
  PID TTY          TIME CMD
17118 pts/4    00:00:00 bash
17193 pts/4    00:00:00 ps

echo 'This is child 4'
This is child 4
 ps
  PID TTY          TIME CMD
17152 pts/5    00:00:00 bash
17194 pts/5    00:00:00 ps

Closing children...
Child[0] closed.
Child[1] closed.
Child[2] closed.
Child[3] closed.
Child[4] closed.
Script complete. Have a nice day.
您可以看到每个子 PID 都与父列表中的一个 PID 匹配。
顺便说一句,我不会连续运行 Python 脚本,而是考虑使用 cron以定时间隔运行脚本以轮询触发器。但是,这可能对您不起作用。
祝你的代码好运!

关于python - 如何使用 Python 和 pexpect 在多个 session 中运行 linux 可执行文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69497794/

相关文章:

javascript - CLI 调用页面后以编程方式访问 HTTP 流量(通过 wget 或 urllib2 等)

python - 变量未定义错误,并且 if 语句不执行

python - 在列表列表中查找索引和总和

python - 创建 numpy 转换矩阵数组的正确方法是什么

php - 我已将 php 版本 7.2 升级到 7.4,现在在 phpmyadmin 面板中出现错误。我附上截图

python - python3 中的 pexpect.expect() 抛出错误 "must be in str , not bytes"

php - 在 ubuntu 上启动 php7.4-fpm 时出现问题

html - 如何解决在 ubuntu apache2 上使用 mod_jk 和虚拟主机重定向到 tomcat 时添加自定义错误 503 页面 html

python - 无法使用 child.before 获取数据

python - 使用 pexpect 时关闭 ssh 连接的正确方法?