在Go中作为命令启动屏幕?

时间:2018-05-29 08:13:15

标签: go gnu-screen

我正在创建一个应用程序,该应用程序将在单独的screen会话中启动脚本。

使用的编译器:go1.10.1 linux / amd64

我目前的代码如下:

cmd := exec.Command("screen", "-S", "test", "node /home/servers/test/main.js")
cmd.Stdout = os.Stdout
cmd.Start()

执行此操作将在输出中返回以下内容:

Must be connected to a terminal.

我也测试过用指定的shell启动它:

cmd := exec.Command("bash", "-c", "screen", "-S", "test", "node /home/servers/test/main.js")

同样的结果。

是否可以执行连接到当前终端的命令?

3 个答案:

答案 0 :(得分:0)

要启动屏幕,您应该模拟tty设备。

GNU屏幕代码:

attach_tty = ttyname(0);
    if (!attach_tty) {
        if (errno == ENODEV) {
            // ....
        } else if (fatal) {
            Panic(0, "Must be connected to a terminal.");
        } else {
            // ...
        }
    }

您可以查看https://github.com/mattn/go-tty

答案 1 :(得分:0)

尝试:

cmd.Run()

代替:

cmd.Start()

答案 2 :(得分:0)

几件事...

首先,我相信您缺少屏幕需要知道的-X stuff部分,以便知道应采取的措施。 -X stuff <text>用于将<text>的内容传递到屏幕中。 (即screen -S test -X stuff "node /home/servers/test/main.js"

这有一个问题...上面的示例仅将文本传递到屏幕。如果您希望它实际执行该文本,则还需要发送“ enter”命令(“ ^ M”)。 (即screen -S test -X stuff "node /home/servers/test/main.js^M"

第二,包括窗口参数-p <#>来确切指定命令应该发送到哪个窗口也不错。我承认,如果您仅使用一个带屏幕的窗口,则可能不需要使用它,但是无论如何使用它都不会受到损害。屏幕编号为以0开头的窗口,因此-p 0将指示第一个窗口,-p 1将指示第二个窗口,依此类推(例如screen -S test -p 0 -X stuff "node /home/servers/test/main.js^M"

最后,由于您最初的问题是关于GOLANG的,所以秘密就是您必须分解整个命令。

cmd := exec.Command("screen", "-S", "test", "-p", "0", "-X", "stuff", "node /home/servers/test/main.js^M")