我正在研究MSCT,这是一个供个人使用的小型Minecraft服务器管理实用程序(目前(。我在屏幕会话中启动服务器,它工作正常。我只是没有运气让屏幕开始连接或让 MSCT 恢复屏幕。
回购在这里:https://github.com/nathanpaulyoung/msct/blob/master/msct.go
第 48 行的相关功能是:
resumeCommand()
这里有一个片段:
func resumeCommand() cli.Command {
command := cli.Command{
Name: "resume",
Aliases: []string{"r"},
Usage: "resume a server's screen session",
Action: func(c *cli.Context) {
servername := c.Args().First()
screenname := buildScreenName(servername)
args := []string{"-x", screenname}
cmd := exec.Command("screen", args...)
if serverExists(servername) {
output, _ := cmd.Output()
println(output)
} else {
println("No server known by the name "" + servername + "". Either server.jar is missing or the server directory was not configured before compilation.")
os.Exit(999)
}
},
}
return command
}
我觉得这一定是我根本不知道的事情,比如某种特殊的方式来调用新的tty或其他东西。如果你们中的任何人知道该解决方案,请提供建议或拉取请求。
也就是说,我一直在更多地考虑这里的真正目标,并认为我会提到这一点,以防产生一个同样令人满意的解决方案,如果不是我所期望的。我希望 Minecraft 服务器继续运行,即使我没有主动查看服务器控制台。无论这意味着当我当前没有 ssh 进入它正在运行的盒子时,还是(在屏幕的情况下(实际上没有连接到屏幕会话,它都应该在没有我眼睛的情况下继续运行。如果有一种方法可以使用 https://golang.org/x/crypto/ssh/terminal 将屏幕内容管道到自定义 golang 终端会话中,或者有一种方法可以创建类似于 Minecraft 服务器可以运行的屏幕的东西,这些将同样令人满意。
您需要创建一个屏幕分离并执行文件而不附加屏幕会话。
为此,您必须使用screen -dmS <screenName> <command>
您还需要将cmd.Output()
更改为cmd.Start()
,因为使用第二个,您无需等待命令结束(在屏幕情况下,执行可能是无限的(
检查这个:使用 golang 在屏幕 (linux( 中启动程序