我正在创建一个应用程序,该应用程序将在单独的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")
同样的结果。
是否可以执行连接到当前终端的命令?
答案 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 {
// ...
}
}
答案 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")