gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 18:48:31 25 4
gpt4 key购买 nike

我正在运行一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com