首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

python -并行运行多个子进程,但允许在bash命令失败时重试吗?

是的,可以使用Python的subprocess模块来并行运行多个子进程,并在命令失败时进行重试。

在Python中,可以使用subprocess.Popen函数来创建子进程,并使用communicate方法来等待子进程完成并获取其输出。要并行运行多个子进程,可以使用concurrent.futures模块中的ThreadPoolExecutorProcessPoolExecutor来创建线程池或进程池。

以下是一个示例代码,演示如何并行运行多个子进程,并在命令失败时进行重试:

代码语言:txt
复制
import subprocess
from concurrent.futures import ThreadPoolExecutor

def run_command(command):
    try:
        # 运行命令
        process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        stdout, stderr = process.communicate()
        return stdout.decode(), stderr.decode()
    except Exception as e:
        return None, str(e)

def run_commands(commands, max_retries=3):
    results = []
    with ThreadPoolExecutor() as executor:
        for command in commands:
            retries = 0
            while retries < max_retries:
                stdout, stderr = executor.submit(run_command, command).result()
                if stderr:
                    retries += 1
                else:
                    break
            results.append((command, stdout, stderr))
    return results

# 要运行的命令列表
commands = [
    'command1',
    'command2',
    'command3',
    # ...
]

# 运行命令并获取结果
results = run_commands(commands)

# 打印结果
for command, stdout, stderr in results:
    print(f'Command: {command}')
    print(f'Stdout: {stdout}')
    print(f'Stderr: {stderr}')
    print('---')

在上述示例中,run_command函数用于运行单个命令,并返回其标准输出和标准错误。run_commands函数使用线程池来并行运行多个命令,并在命令失败时进行重试,最多重试3次。最后,将每个命令的结果打印出来。

请注意,上述示例仅演示了如何在Python中并行运行多个子进程并进行重试,实际使用时可能需要根据具体需求进行适当的修改和调整。

关于Python并行运行子进程的更多信息,可以参考官方文档:https://docs.python.org/3/library/subprocess.html

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

大数据调度平台Airflow(五):Airflow使用

python文件中定义Task之间的关系,形成DAG将python文件上传执行,调度DAG,每个task会形成一个Instance使用命令行或者WEBUI进行查看和管理以上python文件就是Airflow...python脚本,使用代码方式指定DAG的结构一、Airflow调度Shell命令下面我们以调度执行shell命令为例,来讲解Airflow使用。...,我们需要利用这个对象去执行流程from airflow.operators.bash import BashOperator注意:以上代码可以开发工具中创建,但是需要在使用的python3.7环境中导入安装.../simple2.实例化DAGfrom datetime import datetime, timedelta# default_args中定义一些参数,实例化DAG可以使用,使用python dic...datetime import datetime, timedelta# default_args中定义一些参数,实例化DAG可以使用,使用python dic 格式定义default_args

10.8K53

当你 Linux 上启动一个进程时会发生什么?

几年前当我了解到这些,我惊叹不已。 我们要做的是启动一个进程。我们已经博客上讨论了很多关于系统调用的问题,每当你启动一个进程或者打开一个文件,这都是一个系统调用。...你可以通过运行 pstree 命令查看进程树。树的根是 init,进程号是 1。每个进程(init 除外)都有一个父进程,一个进程都可以有很多子进程。...开始是这样的: myparent |-me 然后运行 fork(),生成一个子进程,是我(me)自己的一份克隆: myparent |-me |--cloneofme 然后我让该子进程运行 exec("...事实证明,有了 C 或 Python 的技能,你可以几个小时内编写一个非常简单的 shell,像 bash 一样。(至少如果你旁边能有个人多少懂一点,如果没有的话用时会久一点。)...为什么你需要知道这么 你可能会说,好吧,这些细节听起来很厉害,为什么这么重要?关于信号处理程序或环境变量的细节会被继承?这对我的日常编程有什么实际影响呢? 有可能哦!

1.1K70

100个Linux命令(7)-进程管理

人类会产生错觉,以为操作系统能并行做几件事情,这是通过极短时间内进行进程间切换实现的,因为时间极短,前一刻执行的是进程A,下一刻切换到进程B,不断的多个进程间进行切换,使得人类以为同时处理件事情...: 新状态-->就绪态:当等待队列允许接纳新进程,内核便把新进程移入等待队列 就绪态-->运行态:调度类选中等待队列中的某个进程,该进程进入运行运行态-->睡眠态:正在运行进程因需要等待某事件(...在当前bash环境下,处于可运行状态(即就绪态),当执行cp命令,首先fork出一个bash进程,然后bash上exec加载cp程序,cp子进程进入等待队列,由于命令行下敲的命令,所以优先级较高...当cp命令执行完毕,它将自己的退出状态码告知父进程,此次复制是成功还是失败,然后cp进程自己消逝掉,父进程bash被唤醒再次进入等待队列,并且此时bash已经获得了cp退出状态码。...bash命令本身是bash内置命令,在当前shell环境下执行内置命令本不会创建子shell,也就是说不会有独立的bash进程出现,而实际结果则表现为新的bash是一个子进程

1.7K20

编写可靠 bash 脚本的一些技巧

bash 跟其它的脚本语言最大的不同点之一,应该就是遇到异常继续运行下一条命令。这在很多时候会遇到意想不到的问题。加上 -e ,会让 bash 遇到一个命令失败,立即退出。...还是应该坚持所谓的fail-fast 原则,也就是有异常停止正常运行,而不是继续尝试运行可能存在缺陷的过程。如果有命令可以明确忽略异常,那可以用上面提到的 || true 等方式明确地忽略之。.../bash/manual/html_node/Shell-Parameter-Expansion.html -o pipefail :只要管道中的一个子命令失败,整个管道命令失败。...pipefail 与-e 结合使用的话,就可以做到管道中的一个子命令失败,就退出脚本。 1. 防止重叠运行 一些场景中,我们通常不希望一个脚本有多个实例同时运行。... stackoverflow 上找到的一个方法,原理就是利用 trap 命令脚本退出 kill 掉它整个进程组。

1.2K21

DDIA:批处理和 MPP 数据库千丝万缕

通常来说,MapReduce 对外提供简单的“全有或全无(all-or-nothing)”的输出保证:如果整个任务成功,即使子任务一失败重试最终的输出也会看起来像运行了一次;如果整个任务失败,则没有任何输出...如果失败是由代码 bug 引起的,重试多次后(可以设置某个阈值),会最终引起任务失败如果失败是暂时的,该错误就能够被容忍。...与之相对,MapReduce 遇到某个 map 或 reduce 子任务运行出错,可以单独、自动地进行重试,而不会引起整个 MapReduce 任务的重试。...在这种情况下,由于一个子任务(task) 的故障而重试整个任务(job) 就非常得不偿失。当然,即使只子任务粒度进行重试,也会让那些并不出错的任务运行的更慢(数据要持久化)。...这种假设在多大程度上是正确的呢?大多数集群中,机器确实会故障,非常低频——甚至可以低到大多任务在运行时不会遇到任何机器故障。在这种情况下,为了容错引入的巨量额外损耗值得

16710

大数据调度平台Airflow(六):Airflow Operators及案例

email_on_retry(bool):当任务重试是否发送电子邮件email_on_failure(bool):当任务执行失败是否发送电子邮件retries(int):在任务失败之前应该重试的次数...一、​​​​​​​BashOperator及调度Shell命令及脚本BashOperator主要执行bash脚本或命令,BashOperator参数如下:bash_command(str):要执行的命令或脚本...默认从/tmp/airflow**临时目录查找对应脚本,由于临时目录名称不定,这里建议执行脚本bash_command”中写上绝对路径。...如果要写相对路径,可以将脚本放在/tmp目录下,bash_command”中执行命令写上“sh ../xxx.sh”也可以。first_shell.sh#!...# python中 ** 关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数函数内部自动组装为一个dict。

7.5K53

使用Celery构建生产级工作流编排器

即把每个组件分解为一个单独的任务,该任务必须负责实现其自己的业务目标,它甚至可以失败重试必须实现其目标。...我遇到的某些功能加快了长时间运行进程,这些功能侧重于 worker 轮询任务的方式、指定并发性上的任务分配机制、重试机制和处理故障。...任务失败重试:你的代码可能会失败如何处理失败可以选择,通过 propagate 标志,chord 和 group 中失败的任务不会影响其他任务的执行,添加重试机制将原子地确保任务被工作进程重试。...ELK 上的日志监控 Sentry:处理可能让你感到意外的不同类型数据,错误可能是不可预料的,尤其是当流量很大,Sentry 可能是你的好帮手,它会在出现问题提醒你, Celery 工作进程启动设置...Sentry 允许在生产系统上进行调试的堆栈轨迹 Datadog:需要一个极其强大的工具来进行日志监控、堆栈监控、网络跟踪?…Datadog 可能是一款满足所有需求的最先进工具。

12710

生信自动化流程搭建 06 | 指令

afterScript afterScript指令允许进程运行后立即执行自定义(Bash)代码段。这对于清理暂存区可能很有用。...beforeScript 该beforeScript指令允许运行主流程脚本之前执行自定义(Bash)代码段。这对于初始化基础群集环境或其他自定义初始化可能很有用。...echo 默认情况下,将忽略所有进程中执行的命令所产生的标准输出。将echo指令设置为true可以将进程stdout转发到当前运行最频繁的进程stdout文件,并在shell终端中显示该文件。...maxErrors maxErrors指令允许指定使用retry 错误策略进程失败的最大次数。...当使用网格执行器启动管道,这很有用,因为它允许通过实际执行节点的本地磁盘中的临时目录中运行管道进程来减少NFS开销。仅将在流程定义中声明为输出的文件复制到管道工作区中。

1.6K10

python之fabric模块

python 之 fabric 模块 Fabric 是一个用 Python 开发的部署工具,最大特点是不用登录远程服务器,本地运行远程命令,几行 Python 脚本就可以轻松部署。...默认情况下,当命令执行失败,Fabric会停止执行后续命令。...有时,我们允许忽略失败命令继续执行,比如run(‘rm /tmp/abc’)文件不存在的时候有可能失败,这时可以用with settings(warn_only=True):执行命令,这样Fabric...Fabric是如何在远程执行命令的呢?其实Fabric所有操作都是基于SSH执行的,必要它会提示输入口令,所以非常安全。更好的办法是指定的部署服务器上用证书配置无密码的ssh连接。...-H 指定目标主机,多台主机用‘,’号分隔 -p 远程账号的密码,fab执行时默认使用root账户 -P 以异步并行方式运行主机任务,默认为串行运行 -R 指定role(角色),以角色名区分不同业务组设备

96950

微服务架构-实现技术之三大关键要素3服务可靠性:服务访问失败的原因和应对策略+服务容错+服务隔离+服务限流+服务降级

集群的建立已经满足冗余的条件,而围绕如何进行重试重试就产生了集中常见的容错方式: 1.Failover 失效转移,指当服务调用异常,重新集群中查找下一个可用的服务提供者。...可以简单地理解为一种简单地容错机制,为保证调用路径的完整性,非关键环节中允许出现错误而不中断整个调用链路。 4.Failfast 快速失败,指在获取服务调用异常,立即报错。...彻底放弃重试机制,等同于没有容错。 特定场景中,可使用该策略保证非核心服务只调用一次,为核心业务节约时间。 5.Forking 分支机制,指并行调用多个服务器,只要一个成功即可返回。...2.进程隔离 把隔离媒介替换为JVM。 将系统拆分为多个子系统来实现物理隔离,各个子系统运行在独立的容器和JVM中,通过进程隔离使得一个子系统出现问题不会影响其他子系统。...,不走网络,设计了一个时钟选项,默认的时钟达到了一定时间(这个时间一般设置成平均故障处理时间,也就是MTTR),到了这个时间,进入半熔断状态; (3)Half-Open:半熔断状态,允许定量的服务请求

59920

Supervisor | 笔记

; 程序退出后自动重启,可选值:[unexpected,true,false],默认为unexpected,表示进程意外杀死后才重启 startretries=3 ; 启动失败自动重试次数...startsecs = 5 ; 启动 5 秒后没有异常退出,就当作已经正常启动了 autorestart = true ; 程序异常退出后自动重启 startretries = 3 ; 启动失败自动重试次数...,就当作已经正常启动了 autorestart = true ; 程序异常退出后自动重启 startretries = 3 ; 启动失败自动重试次数,默认是 3 user = root...[program_name] # 重启某个子进程 supervisorctl start [program_name] # 启动某个子进程 supervisorctl remove # 移除某个托管服务...supervisorctl fg mirai 即可再次连接在后台运行的 mirai 进程, 如果进程Mirai Console接收输入,即可通过此方式切换过去输入命令 Supervisord 进程管理

1K20

Linux命令行的艺术

熟练使用命令行是一种常常被忽视或被认为难以掌握的技能,实际上,它可以提高你作为工程师的灵活性以及生产力。本文是一份我 Linux 上工作发现的一些关于命令行的使用的小技巧的摘要。...这篇文章并不长,当你能够熟练掌握这里列出的所有技巧,你就学会了很多关于命令行的东西了。 必读 涵盖范围: * 这篇文章对刚接触命令行的新手以及具有命令行使用经验的人都有用处。...其他的 shell 可能很好用, Bash 功能强大且几乎所有情况下都是可用的 ( 只学习 zsh,fish 或其他的 shell 的话,在你自己的电脑上会显得很方便,但在很多情况下会限制你,比如当你需要在服务器上工作...这对于快速的检查各个子系统非常有帮助。 若要了解内存状态,运行并理解 free 和 vmstat 的输出。...这俩工具在你的程序运行失败、挂起甚至崩溃,而你却不知道为什么或你想对性能有个总体的认识的时候是非常有用的。注意 profile 参数(-c)和附加到一个运行进程参数 (-p)。

6.9K72

2018年8月5日对之前学习python中的问题总结

用于查看进程运行情况 语法格式【ps –ef:以标准格式展示进程信息】 ps用于查看当前进行,ps -ef用于查看当前所有的进程。...后边加上grep是查找用户输入的指定的服务进程 ps -ef|grep sshd ps -ef |grep+服务名是用于查询服务是否正常运行命令输完之后,正常情况下会出现两条信息才能证明服务正常启动了...CMD 所下达的指令为何 虚拟机中创建的文件盘符中为什么找不到? 虚拟机中写的文件盘符中是找不到的,因为所有虚拟机中创建的文件都是经过压缩的 linux中各个发行版本命令都一样?.../pycharm.sh sh/bash FileName 作用:打开一个子shell来读取并执行FileName中命令。...该filename文件可以无"执行权限" ubuntu中sh只是bash的一个链接 ./的命令用法: ./FileName 作用:打开一个子shell来读取并执行FileName中命令

59850

七、应用编排与管理:Job 和 DaemonSet

Job 背景问题 我们如何保证 Pod 内进程正确的结束? 如何保证进程运行失败重试? 如何管理多个任务,且任务之间有依赖关系? 如何并行运行任务,并管理任务的队列大小?...根据依赖关系,保证上一个任务运行完成之后再运行下一个任务 控制任务的并行量 Job 语法 restartPolicy:重试策略 Never:不重试 OnFailure:失败的时候重试...Always:成功与否都重试 backoffLimit:重试次数限制 completions:job 运行总次数 parallelism:并发数 查看 Job 状态 命令:kubectl get job...duration:job运行时长 age:pod创建多久了 Cronjob 语法 startingDeadlineSeconds:job 等待启动的时间限制 concurrencyPolicy:是否允许并行运行...DaemonSet:守护进程控制器 保证集群内的每一个节点都运行一组相同的 pod; 同时还能根据节点的状态保证新加入的节点自动创建对应的 pod; 移除节点的时候,能删除对应的 pod; 而且它会跟踪每个

36720

日拱一卒,麻省理工教你CS基础,那些酷炫无比的命令行工具

这一节课主要讲的的是一些shell中进阶工具的使用,虽然日常工作当中我也经常使用shell命令,有时候也会编写shell脚本,这节课听完仍然让我眼界大开,原来还有这么神奇的工具和用法。...- 上一个命令的返回结果 $$- 当前脚本的运行PID(进程id) !!- 上一个运行命令,包括参数,比如我们运行命令提示没有权限失败,我们想重试可以直接简写sudo !!...比如说,你这里有一个简单的Python脚本,可以反向输出它得到的参数: 内核知道这是一个Python脚本,而不是shell命令,是因为我们脚本头部引入了shebang。...如果你之前不小心有过输入了前导空格的命令,你可以.bash_history或者.zhistory中手动删除它们。 路径导航 现在,我们已经假设你已经熟悉了上面这些操作。 你怎样快速地导航到路径呢?...写一个bash函数,它会重复执行下列脚本,直到失败,并且捕获它的标准输出以及错误流写入文件,并在结束打印出来。如果你还能汇报一共执行了多少次可以获得额外分数奖励 #!

1.5K40

分布式数据同步工具之DataX-Web部署使用

,默认的方式是以Java子进程方式执行DataX,用户可以选择以Python方式来做自定义的改造。...进程,如果存在这表示项目运行成功 如果项目启动失败,请检查启动日志:modules/datax-admin/bin/console.out或者modules/datax-executor/bin/console.out...Tips: 脚本使用的都是bash指令集,如若使用sh调用脚本,可能会有未知的错误 8) 运行 部署完成后,浏览器中输入 http://ip:port/index.html...,将会终止运行中的调度任务并清空队列,然后运行本地调度任务; 增量增新建议将阻塞策略设置为丢弃后续调度或者单机串行 设置单机串行时应该注意合理设置重试次数(失败重试的次数*每次执行时间<任务的调度周期...),重试的次数如果设置的过多会导致数据重复,例如任务30秒执行一次,每次执行时间需要20秒,设置重试三次,如果任务失败了,第一个重试的时间段为1577755680-1577756680,重试任务没结束,

6.7K20

kafka-python 执行两次初始化导致进程卡主

Python logging库重复初始化导致进程卡住 ### 前置知识 1. python的logging库 Python 的 logging 库是一个灵活且强大的日志记录工具,用于应用程序中捕获...异步任务: 允许将任务提交到队列,实现异步执行,提高应用性能和响应速度。 任务调度: 支持定时任务调度,类似于 cron,可以未来的特定时间执行任务。...任务重试: 具备自动重试机制,可配置任务失败进行重试。 监控和管理: 提供工具和界面用于监控和管理任务队列,包括 Web 界面和命令行工具。...多语言支持: 主要用于 Python提供了多语言客户端库,支持其他编程语言的集成。...通过这个库,你可以方便地 Python 中与 Kafka 集群进行通信,实现消息的发布和订阅功能。`kafka-python` 还支持各种配置选项,允许你调整客户端的行为,以满足特定需求。

16310

【管理工具】进程管理工具Supervisor(送书活动)

简单介绍 Supervisor是一个客户端/服务器系统,允许用户类UNIX操作系统上控制许多进程。它是基于python语言开发一个进程管理工具。...Supervisor的服务器端称为supervisord,主要负责启动自身启动管理的子进程,响应客户端的命令,重启崩溃或退出的子进程,记录子进程stdout和stderr输出,生成和处理子进程生命周期中的事件...--version Python 2.7.5 如果没有安装 python环境可以使用yum install python -y进行安装 平台要求 Supervisor可以运行在大多数Unix系统上,但不支持...Supervisor需要Python2.4及以上版本,任何Python 3版本都不支持。...],默认为unexpected,表示进程意外杀死后才重启 startretries=3 ; 启动失败自动重试次数,默认是3 user=tomcat ; 用哪个用户启动进程,默认是root priority

1.5K20

Temporal(三)Workflows

比如我们开启了一个定时的Workflow,但是定时器到达之前,重新修改并提交了Workflow Definition的代码,那么到定时器触发的时候,工作流将执行失败。...进行下面这些动作,支持异步阻塞等待: 开启一个子工作流,可以子工作流开启后阻塞,直到子工作流执行结果返回; 发送Signal,可以发送Signal之后阻塞,等待Signal返回; 开始Activity...但是另一方面,子工作流的部分事件,父工作流里也是要维护的,所以理论上单个父工作流产生不超过1000个子工作流。...也就是说,如果设置了重试策略,并且运行失败或超时,则将首先根据重试策略进行重试,直到运行完成或重试策略已经用尽。...如果到达根据 Cron 计划的下一次运行时间,但是由于当前运行仍处于Open状态(包括重试),则服务器将跳过下一次计划的运行

2.4K30
领券