【发布时间】:2013-07-15 17:15:48
【问题描述】:
open3 只接受 STDIN、STDOUT 和 STDERR。如果正在运行的命令使用其他文件描述符,则 open3 无法捕获这些:
echo foo # Can be captured
echo foo >&2 # Can be catured
echo foo >&3 # Cannot be captured (with open3)
我已经研究过 IPC::Run::run 似乎能够处理这个问题,但我也需要 PID,但我发现 IPC::Run::run 没有办法给我。
是否有一个 openN 或 IPC::Run::run 方法可以给我 PID?
背景
这是用于 GNU Parallel 的可能扩展,因此您可以这样做:
parallel 'echo {} start >&3;sleep 10;echo {} end >&3' ::: a b c 3>out.file
无需混合来自不同作业的输出。 GNU Parallel 需要跟踪每个 pid - 尤其是在使用 --keep-order 时。
【问题讨论】:
-
你为什么要这个 pid?
-
IPC::Open3 不会阻止您在 fd3 上放置管道。它只是不会为你做。
-
孩子的 pid 在 IPC::Run 内部是已知的。只需将
IPC::Run::run替换为IPC::Run::start并转储返回的对象。不幸的是,这没有记录在案,所以你自己...... -
@ikegami 如果您以
echo {} start >&3;sleep 10;echo {} end >&3作为正在运行的命令并将 fd3 分配给 perl 文件句柄来发布答案,我将接受它作为答案。