首页
学习
活动
专区
工具
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 变量的值,并输出相应的消息。

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

相关·内容

systemd的oneshot 与 forking service的区别

A. 服务启动结果判断: 会等待”ExecStart=“ 指定的命令执行完成,然后根据返回值来判定是否执行成功;如果返回值为0, 那么认为执行成功,否则会有类似“failed to start service because control process exited with error code "这样的报错信息. 如果有多个“ExecStart=” 参数,那么会依次执行,只要有返回值是“error code”的,那么都会导致该service 启动失败. B. 服务状态查看: 无论执行成功或者失败,通过 "systemctl status" 来查看服务状态的时候,一般都会有 “Main PID: xxxx (code=exited, status=xx/...)” 之类的提示,只有 status=0 才表示服务启动成功,和上面A的描述是一致的,但是我们有时候可能会看到 "systemctl status” 显示该服务的状态是 : inactive(dead) 之类的提示,这是因为: control process 退出之后,oneshot类型的服务自动进入 inactive(dead) 状态, 但是如果设置了: RemainAfterExit=yes 的话,那么oneshot 类型的service 在成功启动之后会进入actived 状态. 所以,对于oneshot类型的服务,要查看其当前的状态,应该查看“exit ” code. C. 从子进程的角度看oneshot: 对于oneshot类型的service, 其在启动过程中并不关注有没有子进程,也不关注子进程的状态变化, 只要control process 退出的code 是0, 那么就表示启动成功. 所以很多服务的启动脚本可以修改为oneshot 类型的service unit.

04
领券