Bash pipe:获取管道中前一个进程的退出状态

Posted

技术标签:

【中文标题】Bash pipe:获取管道中前一个进程的退出状态【英文标题】:Bash pipe: get the exit status of previous process in pipeline 【发布时间】:2021-01-16 20:42:52 【问题描述】:

我正在编写一个记录器来捕获脚本的输出,并在前一个程序失败或成功时以不同方式处理该输出:

program1 | logger.sh

logger.sh 中,我打算有类似的东西:

while IFS= read -r line; do
    CAPTURED_OUTPUT="$CAPTURED_OUTPUT\n$line"
done
if "program1 has failed"; then
    echo "$CAPTURED_OUTPUT"
fi

如何知道在 logger.sh 中“program1 失败了”?

注意 program1 是通用的,我无法控制它。

想法:

program1 以非零状态退出时,logger.sh 端是否收到任何信号? 能否找到“program1”的 PID 并获取其退出状态? ...

【问题讨论】:

logger.sh 还做其他事情吗?执行if output=$(program1); then echo "program1 has failed"; echo "$output"; fi 之类的操作会更简单,尽管使用文件系统比使用 shell 变量存储无限量的数据更合适。 回应@chepner 的评论,你能不能把用法改成logger.sh program1 这样脚本负责启动程序?这会让它更容易监控程序。 【参考方案1】:

我认为你可以通过这个实现你想要的:

program1 > program1.log || cat program1.log
rm program1.log

那么你根本不需要logger.sh

这会将program1stdout 重定向到program1.log,如果program1 的退出代码不为零,则将打印program1.log。之后,program1.log 被删除。

【讨论】:

以上是关于Bash pipe:获取管道中前一个进程的退出状态的主要内容,如果未能解决你的问题,请参考以下文章

从最后一个管道(stdin)获取退出代码

进程之间通信之有名管道无名管道(pipe),笔记

管道状态码循环

管道状态码循环

进程通信方式-管道pipe

Linux进程间通信之管道(pipe)命名管道(FIFO)与信号(Signal)