【问题标题】:Is PIPESTATUS of processes running in background trackable?在后台运行的进程的 PIPESTATUS 是否可跟踪?
【发布时间】:2019-08-04 09:40:24
【问题描述】:

按照 Cyrus 的建议扩展 question,我想知道如果我将其发送到后台运行,是否可以使用 PIPESTATUS 或类似的东西跟踪相同的脚本?

bash 脚本如下:

#! /bin/bash

{ python script.py 2>&1  | tee logfile.log; } &
ret="${PIPESTATUS[0]}"
if [[ "$ret" -ne "0" ]]; then
  echo "$ret"
fi

script.py 是:

print("hello")
exit(1);
print("world")

当我在没有& 的情况下运行bash 脚本时,它会正确打印PIPESTATUS,但如果我在后台运行它,则不会返回任何输出。

【问题讨论】:

  • 它是,但在子外壳内部,而不是外部。

标签: bash pipestatus


【解决方案1】:

首先,正如 Kamil Cuk 所说,如果你想要后台进程的管道状态,你需要:

{ python script.py 2>&1  | tee logfile.log; exit "${PIPESTATUS[0]}" }

但是由于您在后台运行某些东西,您的 if 语句可能会在它完成之前运行,那么您希望它测试什么返回值?

你通常想要的是在后台运行一些东西,做一堆工作,然后wait 用于后台任务,然后才检查它的返回值。

wait会返回后台shell的退出状态,这样才能真正得到exit "${PIPESTATUS[0]}"生成的退出码

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-10
    • 2013-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多