shell 在重定向并行处理的输出时,并行处理在所有进程完成后永久挂起

0tdrvxhp  于 2022-11-16  发布在  Shell
关注(0)|答案(1)|浏览(151)

使用以下脚本:

#!/bin/bash

xerr() {
  sed -ue "s/^/(stderr) ${FUNCNAME[1]}: /" >&2
}
xlog() {
  sed -ue "s/^/(stdout) ${FUNCNAME[1]}: /"
}

main() {
  {
      sleep 0.25 && echo "ok" &
      sleep 1.00 && echo "ok" &
      sleep 0.65 && echo "fail" >&2 &
      sleep 1.00 && echo "ok" &
      sleep 0.65 && echo "ok" &
      wait
      echo "Finished"
  } 2> >(xerr) > >(xlog)
}

main

后台进程成功完成,但在wait中永久挂起:

(stdout) main: ok
(stdout) main: ok
(stderr) main: fail
(stdout) main: ok
(stdout) main: ok
^C

然而,当(1)不重定向其输出或(2)不并行运行时,所有都按预期工作:

#(1)
main() {
  {
      sleep 0.25 && echo "ok"
      sleep 1.00 && echo "ok"
      sleep 0.65 && echo "fail" >&2
      sleep 1.00 && echo "ok"
      sleep 0.65 && echo "ok"
      echo "Finished"
  } 2> >(xerr) > >(xlog)
}

main

#(stdout) main: ok
#(stdout) main: ok
#(stderr) main: fail
#(stdout) main: ok
#(stdout) main: ok
#(stdout) main: Finished

#(2)
main() {
  {
      sleep 0.25 && echo "ok" &
      sleep 1.00 && echo "ok" &
      sleep 0.65 && echo "fail" >&2 &
      sleep 1.00 && echo "ok" &
      sleep 0.65 && echo "ok" &
      wait
      echo "Finished"
  }
}

main

# ok
# fail
# ok
# ok
# ok
# Finished

这有什么原因吗?我如何并行运行进程,同时重定向它们的输出?

bfnvny8b

bfnvny8b1#

这有什么原因吗?
>(xerr)>(xlog)也是后台进程; wait也在等着他们。
如何并行运行进程并同时重定向其输出?

main() {
  { { {
    sleep 0.25 && echo "ok" &
    sleep 1.00 && echo "ok" &
    sleep 0.65 && echo "fail" >&2 &
    sleep 1.00 && echo "ok" &
    sleep 0.65 && echo "ok" &
    wait
    echo "Finished"
  } 2>&4 | xlog >&3; } 4>&1 | xerr >&3; } 3>&1
}

相关问题