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

如何在bash中等待多个子进程完成并返回退出代码!= 0当任何子进程以代码结束时!= 0?

在 Bash 中,可以使用 wait 命令来等待多个子进程完成,并通过 $? 变量获取子进程的退出代码。可以使用一个循环来检查所有子进程是否已经完成,并使用一个变量来记录是否有任何子进程以代码不等于 0 结束。以下是一个示例脚本:

代码语言:bash
复制
#!/bin/bash

# 启动多个子进程
process1 &
process2 &
process3 &

# 初始化一个变量来记录是否有任何子进程以代码不等于 0 结束
any_failed=0

# 等待所有子进程完成
for job in $(jobs -p)
do
    wait $job
    if [ $? -ne 0 ]; then
        any_failed=1
    fi
done

# 检查是否有任何子进程以代码不等于 0 结束
if [ $any_failed -eq 1 ]; then
    echo "At least one child process exited with non-zero status"
else
    echo "All child processes exited with zero status"
fi

在这个脚本中,我们首先启动多个子进程,并使用 & 符号将它们放入后台运行。然后,我们使用 jobs -p 命令获取所有子进程的进程 ID,并使用 wait 命令等待它们完成。在循环中,我们检查每个子进程的退出代码,并将 any_failed 变量设置为 1 如果有任何子进程以代码不等于 0 结束。最后,我们检查 any_failed 变量的值,并输出相应的消息。

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

相关·内容

何在Bash等待个子进程完成,并且其中任何个子进程非零退出状态结束时,使主进程返回一个非零的退出码?

问题 如何在 Bash 脚本中等待该脚本启动的多个子进程完成,并且这其中任意一个子进程非零退出结束时,让该脚本也返回一个非零的退出码? 简单的脚本: #!.../bin/bash for i in `seq 0 9`; do calculations $i & done wait 上述脚本将会等待所有 10 个被创建的进程结束,但它总会给出退出状态 0...我应该如何修改这个脚本,使其能检测到被创建进程退出状态,并且任何进程非零代码结束时,让脚本返回退出码 1?.../usr/bin/env bash # 这是一个特殊的 sleep 函数,它将睡眠的秒数作为"错误代码" # 或"返回代码"返回,以便我们可以清楚地看到,实际上 # 我们在每个进程完成时确实获取了它的返回代码...[ $rc -ne 0 ] && break # 若进程非零退出码结束,则跳出循环 done #echo $rc exit $rc 将代码保存为文件 wait_procs_demo.sh,再运行测试

5300

Linux僵尸进程

一个父进程fork()系统调用建立一个新的进程后,核心进程就会在进程给这个子进程分配一个进入点,然后将相关信息存储在该进入点所对应的进程表内。这些信息中有一项是其父进程的识别码。...pid = -1 :等待任何进程,相当于wait函数。 pid = 0:等待同一个进程任何进程(如果子进程已经加入了别的进程组,waitpid 不会等待它)。...pid > 0:等待任何进程识别码为pid的进程 pid < -1:等待进程组识别码为pid绝对值的任何进程options:它的取值组合由系统预定义的。可以为0和一些宏的或。...他为0时,和wait()一样,阻塞父进程等待进程退出他取值为WNOHANG时,如果没有已经结束的进程则马上返回,不等待进程。最常用的就是这两个。...设置了选项 WNOHANG,而调用 waitpid() 发现没有已退出进程等待返回0。所以取到的进程的PID是0

4.4K20

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

在cp这个子进程执行过程,父进程bash会进入睡眠状态(不仅是因为cpu只有一颗的情况下一次只能执行一个进程,还因为进程等待),等待被唤醒,此刻bash无法和人类交互。...cp命令执行完毕,它将自己的退出状态码告知父进程,此次复制是成功还是失败,然后cp进程自己消逝掉,父进程bash被唤醒再次进入等待队列,并且此时bash已经获得了cp退出状态码。...(5)非内置命令的命令替换:命令行包含了命令替换部分时,将开启一个子shell先执行这部分内容,再将执行结果返回给当前命令。...17 进程中断或退出时,发送该信号告知父进程自己已完成,父进程收到信号将告知内核清理进程列表。...此信号为EXIT信号,表示直接退出。如果kill发送的信号是0(即kill -0)则表示不做任何处理直接退出,但执行错误检查:检查发现给定的pid进程存在,则返回0,否则返回1。

1.7K20

等待进程的那些事儿

: wait 用于等待任何个子进程,相当于 waitpid (-1, status, 0);  没有任何进程存在时,返回 -1,errno 设置为 ECHILD; waitpid 相对于 wait...的优势在于: 可以指定子进程 (组) 来等待; 可以捕获进程除结束以外的其它状态变更通知,挂起 (WUNTRACED)、继续 (WCONTINUED) 等; 可以不阻塞的测试某个子进程是否已结束...例如 bash,它除了在主线程同步等待前台正在运行的进程,还必需在信号处理器异步接收后台运行进程的状态反馈,这样就不得不混合使用 wait。...62 } 父进程启动两个子进程,第一个休眠 3 秒后退出,第二个休眠 4 秒后退出,由于父进程同步等待的是第二个子进程,因此第二个进程模拟前台进程,第一个进程模拟后台进程。...在处理器也应使用 waitpid 等待进程返回 ECHILD 错误,证明该进程是前台进程,已经被同步 wait 掉了,不需要任何处理;否则作为后台进程处理。

2.4K30

【Linux】详解进程终止&&进程等待

进程退出码则是进程结束运行时返回给操作系统的一个整数值,用于表示进程的执行状态或结果,是下对上返回的结果。 2.3、exit exit就是用来终止进程的,exit括号的内容就是进程退出码。...在我们的代码进程,在任意地方调用exit都表示进程退出。...进程运行完成,结果对还是不对,或者是否正常退出。...调用wait函数父进程默认进行阻塞等待,会等待任意一个子进程退出等待成功,wait会返回进程的pid,等待失败返回小于0的值。 ...采用非阻塞的方法等待进程退出成功返回进程的pid,进程还在继续自己的工作返回0进程出错返回小于0的数。

14810

【嵌入式】基于ARM的嵌入式Linux开发总结

实际上是在父进程执行fork()函数时,父进程会复制一个子进程,而且父子进程代码从fork()函数的返回开始分别在两个地址空间中同时运行,从而使两个进程分别获得所属fork()函数的返回值,其中在父进程返回值是进程进程号...pid=-1:等待任何个子进程退出,此时和wait作用一样。 pid=0等待其组ID等于调用进程的组ID的任一进程。 pid<-1:等待其组ID等于pid的绝对值的任一进程。...0:同wait,阻塞父进程等待进程退出。...pid=-1:等待任何个子进程退出,此时和wait作用一样。 pid=0等待其组ID等于调用进程的组ID的任一进程。 pid<-1:等待其组ID等于pid的绝对值的任一进程。...0:同wait,阻塞父进程等待进程退出

18.2K20

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

/bash/manual/html_node/Shell-Parameter-Expansion.html -o pipefail :只要管道的一个子命令失败,整个管道命令就失败。...pipefail 与-e 结合使用的话,就可以做到管道的一个子命令失败,就退出脚本。 1. 防止重叠运行 在一些场景,我们通常不希望一个脚本有多个实例在同时运行。...意外退出时杀掉所有进程 我们的脚本通常会启动好多子脚本和进程父脚本意外退出时,进程其实并不会退出,而是继续运行着。如果脚本是周期性运行的,有可能发生一些意想不到的问题。...因为 SIGKILL 时,进程是没有机会运行任何代码的。 3. timeout 限制运行时间 有时候需要对命令设置一个超时时间。...这时可以使用 timeout 命令,用法很简单: timeout 600s  some_command arg1 arg2 命令在超时时间内运行结束时返回码为 0,否则会返回一个非零返回码。

1.2K21

僵尸进程的产生与处理

僵尸进程(Zombie Process)是指在操作系统已经完成了执行,但其父进程尚未调用wait()或waitpid()来获取其终止状态的进程。...一个进程结束时,操作系统会保留该进程的一些基本信息,包括进程ID(PID)、退出状态等,以供父进程查询。...,显示为defunct状态,即zombie进程。 wait()和waitpid()是用于在父进程等待进程终止获取其终止状态的系统调用函数。...pid_t waitpid(pid_t pid, int* status, int options);  pid参数用于指定等待进程ID。指定为-1时,表示等待任意一个子进程终止。...wait()和waitpid()函数的返回值可以提供一些信息: 返回一个大于0的值表示已终止的进程的PID。 返回0表示使用了WNOHANG选项,且当前没有已终止的进程

20720

【Linux】进程理解与学习(Ⅱ)

(可以这么来说: S状态就意味着进程等待事件完成等待资源就绪),并且这种状态是可以被我们使用指令来中断。)...僵尸状态(Z) 返回代码 我们每一个进程结束时都会有一个退出码,就好像我们写一个main函数时,最后都会加上return 0,return 0就表示该进程正常返回(事实上就算我们不写return 0,系统也会默认...return 0),这里的0就是该进程返回代码。...指令来查看该进程返回代码) vs下编译后的返回代码 僵尸状态(Z) 僵尸状态是指一个进程结束时,它的返回代码没有被父进程读取,那么该进程会一直处于一种僵尸状态,等待进程读取,直到父进程读取返回结果后...暂停状态实际上也是阻塞(要等待你发出指令继续运行) 僵尸状态是指进程退出时,退出结果没有被父进程读取,进程就会保持僵尸状态,直到父进程读取返回结果,才彻底结束。

57730

什么是PHP7的孤儿进程与僵尸进程

一个 进程完成它的工作终止之后,它的父进程需要调用wait()或者waitpid()系统调用取得进程的终止状态。...孤儿进程 一个父进程退出,而它的一个或多个子进程还在运行,那么那些进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。...任何个子进程(init除外)在exit()之后,并非马上就消失掉,而是留下一个称为僵尸进程(Zombie)的数据结构,等待进程处理。这是每个 进程结束时都要经过的阶段。...如果父进程进程结束之前退出,则进程将由init接管。init将会进程的身份对僵尸状态的进程进行处理。...pcntl_wait() 函数: 这个函数的作用就是 “ 等待或者返回进程的状态 ”,进程执行了该函数后,就会阻塞挂起等待进程的状态一直等到进程已经由于某种原因退出或者终止。

86330

【Linux】开始掌握进程控制吧!

注意:进程调用fork,控制转移到内核的fork代码后,内核做以下工作: 分配新的内存块和内核数据结构给进程 将父进程部分数据结构内容拷贝至进程进程:内核的相关数据管理的数据结构(task_struct...进程运行完成,结果对还是不对,或者是否正常退出。...父进程通过进程等待的方式,回收进程资源,获取进程退出信息 也就是说,任何进程退出时都要被父进程进行等待,不然进程处于僵尸进程就会造成内存泄漏!!!...返回值: 正常返回的时候waitpid返回收集到的进程进程ID; 如果设置了选项WNOHANG,而调用waitpid发现没有已退出进程可收集,则返回0; 如果调用中出错,则返回-1,这时errno...会被设置成相应的值指示错误所在; 参数: pid: Pid = -1 , 等待任一个子进程

7710

如何编写bash脚本以便在进程死机时重新启动进程

: # crontab */5 * * * * /path/to/keepalivescript.sh 答: 避免使用 PID 文件、cron 或其他任何试图评估不属于其进程进程。...在UNIX,有充分的理由只能等待进程任何试图解决这个问题的方法(ps解析、pgrep、存储PID等)都是有缺陷的,其中存在漏洞。待后文分析。...假设你的进程名为procA,监控它的进程名为procB,则需要procB成为procA的父进程。因为只有启动你的进程进程才能可靠地等待它结束。而这在Bash很容易实现。...Restart..." >&2 sleep 1 done 上面的bash代码在一个until循环中运行procA。第一行启动procA等待它结束。结束时,until检查其退出状态。...如果退出状态不是0,until将运行循环体,该循环体在STDERR上发出错误消息,并在 1 秒后重新启动循环(返回第 1 行)。 我们为什么要等一会儿?

16020

【Linux】Linux进程控制>进程创建&&进程终止&&进程等待&&进程程序替换

进程进程,而原进程为父进程 #include pid_t fork(void); 返回值:自进程返回0,父进程返回进程id,出错返回-1 进程调用fork,控制转移到内核的...进程运行完成,结果对还是不对,或者是否正常退出进程通过进程等待的方式,回收进程资源,获取进程退出信息 3.2 进程等待的方法 3.2.1 wait方法 #include<sys/types.h...); 返回值: 正常返回的时候waitpid返回收集到的进程进程ID; 如果设置了选项WNOHANG,而调用waitpid发现没有已退出进程可收集,则返回0; 如果调用中出错,则返回-...1,这时errno会被设置成相应的值指示错误所在; 参数: pid: Pid=-1,等待任一个子进程。...shell建立一个新的进程,然后在那个进程运行ls程序等待那个进程结束 然后shell读取新的一行输入,建立一个新的进程,在这个进程运行程序 等待这个进程结束。

10110

MIT6.828实验2 —— Lab Shell

首先需要了解几个核心的系统调用: * **fork() :** 该调用会创建一个子进程,会复制一份内存到独立的进程空间,代码根据返回值来区分是进程 (返回0) 还是父进程 (返回进程的pid)。...* **wait():**该方法会阻塞父进程等待进程退出后再结束,注意如果fork()了多个子进程,则需要多次调用wait()才能等待所有进程完成。且wait()是无法等待孙子进程的。...; // 解析执行命令 } wait(0); // 等待进程退出 } exit(0); } getcmd() 实现较简单...* 在进程close()关闭标准输出fd,dup()复制管道其中一端的fd,然后执行命令 * 父进程需要调用两次wait()来等待个子进程结束 从实现思路上也可以看出,由于管道的实现依赖于进程对...,从而实现顺序执行的效果; * BACK:由 & 结尾的后台命令,实现方法是fork一个子进程执行命令,父进程则直接退出

1.7K30

【Linux】进程概念(上)

: 我们可以观察到,父进程的 pid 是 15264;ppid 是28553,也就是 bash返回值是其进程的 pid; 进程的 pid 是 15265;ppid 是 15264;返回值是 0....首先我们先了解一下 fork() 在做什么,fork() 创建进程,系统中会个子进程,os 会进程为模板,为进程创建一个 PCB,而父进程会与进程共享代码和数据,所以 fork() 之后,...为什么 fork() 的两个返回值,会给父进程返回进程的 pid,给进程返回 0?...Z(zombie) - 僵尸进程 僵尸状态(Zombies)是一个比较特殊的状态。进程退出并且父进程(使用wait()系统调用,后面讲)没有读取到进程退出返回代码时就会产生僵尸进程。...僵尸进程终止状态保持在进程,并且会一直在等待进程读取退出状态代码。 所以,只要子进程退出,父进程还在运行,但父进程没有读取进程状态,进程进入Z状态。

9710

【Linux】进程控制

下面我们尝试一下在 main 函数返回0;其中我们的 main 函数是在一个程序的,该程序运行起来就是一个进程,而且是 bash进程,所以该进程最终会给 bash 返回 main 的返回值...父进程创建进程是要让进程完成相应的任务,进程完成得如何得让父进程知道,所以需要通过进程等待的方式,获取进程退出的信息;而获取进程退出的信息我们上面学过退出码和是否有接收到信号,所以只需要获取这两个数字的信息即可...系统调用: wait 的作用是等待进程的任意一个子进程退出。...不返回; 非阻塞式等待:如果等待条件不满足,wait/waitpid 不阻塞,而是立即返回; 非阻塞等待进程检测到进程还没就绪,即等待条件不满足时,往往要进行重复调用,重复检测进程的状态...所以我们重新看 waitpid 的返回值,其中 > 0等待成功,进程退出了,返回的是进程的 pid;== 0 等待是成功的,但是进程还没有退出;< 0等待失败。

10310

Linux wait() 和 waitpid()函数介绍

2, WEXITSTATUS(status) WIFEXITED返回非零值时,我们可以用这个宏来提取进程返回值,如果子进程调用exit(5)退出,WEXITSTATUS(status) 就会返回5...Pid>0.等待进程ID与pid相等的进程。 Pid==0等待其组ID等于调用进程组ID的任一个子进程。 Pid<-1等待其组ID等于pid绝对值的任一进程。...Waitpid返回值和错误 waitpid的返回值比wait稍微复杂一些,一共有3种情况: 正常返回的时候,waitpid返回收集到的进程进程ID; 如果设置了选项WNOHANG,而调用waitpid...发现没有已退出进程可收集,则返回0; 如果调用中出错,则返回-1,这时errno会被设置成相应的值指示错误所在; pid所指示的进程不存在,或此进程存在,但不是调用进程进程,waitpid...从结果,我们看到父进程一直在等待进程的结束。

2.2K50

【Linux】进程控制(创建、终止、等待)

调用fork函数之前,父进程独立运行,调用fork之后,会执行两个执行流,即父子进程共享fork函数之后的代码。...常见的三个函数如下: 1、main函数的return语句 该方法是最为常见的一种方法,当在main函数执行return指令,则表示该进程终止,返回return后面的退出码。...,进程是要让父进程拿到自己的退出码以及退出状态,否则就算自己被kill掉了,也是处于一种僵尸状态(Z状态)存在着,直到父进程拿到自己的退出码以及退出状态,进程才结束僵尸状态(bash进程由于bash...(id,&status,0);//0表示阻塞式等待,只有进程结束时,父进程才会执行后面的指令...,%d十进制打印(退出码) //status &0x7F则是取到低7位的值,并以10进制打印(退出信号) } 先来看一下执行结果: ​ 当然,我们不仅可以通过位运算获得进程退出码以及退出信号

3.4K40

python—subprocess、gl

像Linux进程那样,一个进程可以fork一个子进程让这个子进程exec另外一个程序。在Python,我们通过标准库的subprocess包来fork一个子进程运行一个外部的程序。...subprocess包定义有数个创建进程的函数,这些函数分别不同的方式创建进程,所以我们可以根据需要来从中选取一个使用。...subprocess.call() 父进程等待进程完成 返回退出信息(returncode,相当于Linux exit code) subprocess.check_call() 父进程等待进程完成...返回进程向标准输出的输出结果 检查退出信息,如果returncode不为0,则举出错误subprocess.CalledProcessError,该对象包含有returncode属性和output属性...Popen对象创建后,主程序不会自动等待进程完成

1.5K20

Linux系统进程编程之回收进程(三)

“僵尸进程”是一个早已死亡的进程,而且“僵尸进程”已经放弃了几乎所有的内存空间,没有任何可执行代码,也不能被调度,但在进程表(processs table)仍占了一个位置(slot),记载该进程退出状态信息供其他进程收集...wstatus用来返回进程结束时的状态,父进程通过wait得到wstatus后就可以知道子进程的一些结束状态信息。...返回值是进程的ID,当前父进程有可能有多个子进程,wait函数阻塞直到其中一个子进程结束wait就会返回,wait的返回值就可以用来判断到底是哪一个子进程本次被回收了: wait(): on success...二、第二招:发送SIGCHILD信号: 1、我们还可以发送SIGCHILD信号来防止产生僵尸进程进程退出时向父进程发送SIGCHILD信号,父进程处理SIGCHILD信号,然后用上面信号处理函数调用...的进程而是回收任意一个子进程0表示用默认的方式(阻塞式)来进行等待返回值ret是本次回收的进程的PID */ /* 等待回收PID为pid的这个子进程,如果当前进程并没有一个ID号为

3.2K20
领券