Go语言 如何检查一个程序是在终端运行还是在后台运行?

hfwmuf9z  于 2023-10-14  发布在  Go
关注(0)|答案(1)|浏览(183)

嗨,我正在运行一个go程序,它根据执行情况以两种方式提供一些输出:

  • 如果在终端执行,则输出到stdout
  • 它与键盘快捷键配对(例如。CTRL+M),其中如果通过键盘快捷键调用,则将输出作为通知发送。

现在我想确定程序是否在终端运行**来决定输出的模式.在Linux中有什么方法可以确定这个条件吗?
目前该程序是输出在两个标准输出和通知,我想只有通过通知发送输出时,它是通过键盘快捷键调用。因为当stdout不在终端中运行时,打印到stdout是毫无用处的。

j8yoct9x

j8yoct9x1#

我假设当它通过键盘快捷键调用时,它以某种方式由桌面环境运行,输出不会是终端,所以你可以检查whether stdout is a tty or not。基于Arkadiusz Drabczyk's answer,可以使用以下代码:

  1. package main
  2. import (
  3. "os"
  4. "golang.org/x/sys/unix"
  5. )
  6. func main() {
  7. _, err := unix.IoctlGetWinsize(int(os.Stdout.Fd()), unix.TIOCGWINSZ)
  8. if err != nil {
  9. // Show notification here
  10. } else {
  11. // Print to stdout here
  12. }
  13. }

**请注意,当使用|>重定向时,这也会导致它使用通知而不是标准输出。**如果这不好,您将不得不使用显式命令行参数-我个人更喜欢这种方式,因为它清楚地传达了意图,不会有意外。你可以接受一个参数--notification,你可以将它添加到键盘快捷键中,但在命令行中调用工具时不使用它。

如果出于某种原因添加参数不方便,您也可以使用具有不同名称的符号链接并检查os.Args[0]。例如,如果你的程序是~/bin/hello,那么你会创建一个名为~/bin/hello-notify的“第二个版本”,它实际上只是~/bin/hello的符号链接,但是在你的代码中,你会检查你的os.Args[0]是否以-notify结尾。然后,您可以将键盘快捷键连接到~/bin/hello-notify,但在命令行中使用~/bin/hello

展开查看全部

相关问题