如何使用Python和pexpect在多个会话中并行运行Linux可执行文件
需求适配性判断
pexpect完全可以满足该场景的所有要求,它支持独立子进程管理、交互式指令输入、自定义超时控制,天然适配多并行任务、强制超时终止、交互式停止的需求。
具体实现逻辑
- 主进程持续监听触发信号,每次收到触发请求时启动独立线程处理本次可执行文件调用,避免阻塞后续触发请求,实现多任务并行。
- 每个线程内部单独初始化pexpect子进程,绑定动态生成的入参,设置全局超时时间为1200秒(20分钟)。
- 子进程生命周期内如果触发超时、或者收到外部终止指令,先发送
Ctrl+C(ASCII码\x03),再输入stop指令触发程序正常终止,若程序仍未退出则调用强制kill逻辑。 - 每个子进程的生命周期、超时计时完全独立,互不干扰。
可用代码示例
import threading import pexpect from pexpect.exceptions import TIMEOUT, EOF def run_executable(params: list): # 此处替换为你的可执行文件绝对路径 exec_path = "/absolute/path/to/your/executable" child = None try: # 启动子进程,全局超时设置为20分钟(1200秒) child = pexpect.spawn(exec_path, params, timeout=1200) # 等待进程正常结束,进程自行退出会返回EOF,超时则触发TIMEOUT异常 child.expect(pexpect.EOF) except TIMEOUT: # 触发20分钟超时,走终止流程 if child and child.isalive(): # 发送Ctrl+C中断信号 child.send('\x03') # 等待1秒让程序响应中断 try: child.expect(pexpect.EOF, timeout=1) except (TIMEOUT, EOF): # 输入stop指令触发正常终止 child.sendline('stop') # 再等待3秒确认退出 try: child.expect(pexpect.EOF, timeout=3) except TIMEOUT: # 仍未退出则强制杀死进程 child.close(force=True) except EOF: # 程序正常自行终止,无需额外处理 pass finally: # 兜底清理残留进程 if child and child.isalive(): child.close(force=True) # 此处可添加执行完成后的回调逻辑,比如日志记录、结果上报等 def main(): while True: # 此处替换为你实际的触发信号监听逻辑,返回触发状态和动态参数 trigger_signal, dynamic_params = wait_for_your_custom_trigger() if trigger_signal: # 收到触发后启动独立线程执行,不阻塞主进程监听后续触发 task_thread = threading.Thread(target=run_executable, args=(dynamic_params,), daemon=True) task_thread.start() if __name__ == "__main__": main()
注意事项
- 部署前先执行
pip3 install pexpect安装依赖,Ubuntu 18自带的Python3.6版本兼容pexpect最新稳定版。 - 若需要限制最大并行数量,可以添加线程池或者全局计数器控制同时运行的任务数,避免服务器资源耗尽。
- 终止流程中的等待时长可根据你的可执行文件实际响应速度灵活调整。
内容的提问来源于stack exchange,提问作者KTsi
相关产品推荐
相关产品推荐

