代码之家  ›  专栏  ›  技术社区  ›  learningtech

重定向至“执行中的stderr死机返回终端”诊断树

go
  •  -2
  • learningtech  · 技术社区  · 6 年前

    我正在尝试将恐慌/标准错误重定向回具有以下go代码的bash终端:

        if err := syscall.Dup2(-1,int(os.Stderr.Fd())); err != nil {
          log.Fatalf("Failed to redirect stderr to bash: %v",err)
        }
    

    但是错误给了我一个“坏的文件描述符”,可能是因为 -1 我在第一次辩论中使用过。我选择了价值观 - 1 因为我发现了 int(file.(*os.File).Fd()) 返回A - 1 什么时候? file.Close() 已被调用。

    至于我想做什么。在我的程序中的其他地方,我调用了 syscall.Dup2(int(file.Fd()), int(os.Stderr.Fd())) 将stderr记录到外部文件。但我希望stderr偶尔指向bash终端。

    https://golang.org/pkg/syscall/ 不详细解释syscall.dup2。我开始研究file.fd()返回的内容以及如何使用它,但也没有完全理解。

    有人能告诉我如何将stderr重定向回bash终端吗?

    3 回复  |  直到 6 年前
        1
  •  2
  •   Davis Herring    6 年前

    Dup2 . (一般来说,使用 dup2 int(os.Stderr.Fd())

        2
  •  1
  •   Basile Starynkevitch    6 年前

    一般来说,这是不可能的 ,因为可以启动(或运行)Unix程序 任何终端。例如,它可以由 crontab(5) 工作,或通过一些 at ssh redirections pipeline

    通常的做法是让程序的用户重新定向 stderr shell yourprogram 2> /tmp/errorfile documentation of bash about redirections

    Terminals 是相当复杂的东西。你可以阅读 TTY demystified pty(7) termios(3) ncurses 库(已包装为 goncurses 进去)。

    在程序的其他地方,我调用了一个syscall.dup2(int(file.fd()),int(os.stderr.fd()),它将stderr记录到一个外部文件中。

    这真是个坏主意。用户期望他/她 stderr 标准错误 standard streams

    file descriptor process dup2(2) syscall.Dup2

    /proc/1234/fd/ proc(5)

    /dev/tty tty(4) 更多信息。但是,我不建议这样做(因为你最好把程序设计成可运行的

    您可能需要阅读一些Linux编程书籍,例如 ALP .

    为了记录,Go提供了 log syslog(3) 以及 log/syslog

    我不知道Windows,但我相信它也可以在没有任何终端的情况下启动程序,例如 background process

        3
  •  0
  •   learningtech    6 年前

    我不知道为什么,但是 syscall.Dup2(0,int(os.Stderr.Fd()))

    0

    另外,我还没有在Windows机器上尝试过这种方法,所以不确定会发生什么。我希望其他人能给出更好的答案。