尝试打开并记录新 gnome 终端窗口的输出

尝试打开并记录新 gnome 终端窗口的输出

我正在尝试编写一个简短的脚本来打开一个新的终端窗口,执行一个启动游戏服务器的变量,并记录该新窗口的输出。

服务器在控制台中发送了大量完全无用的垃圾邮件,因此我还想附加 -q 以便隐藏窗口。

我的最终目标是使用 grep 查看“已连接到 Steam 服务器”的日志,并在主控制台中报告它。目前我有以下内容:

$server="$game_path/server_executable"
gnome-terminal -- $server

我添加到 gnome-terminal 的任何内容都会破坏代码。我尝试使用 gnome-terminal -- "$server 2>&1 | tee server.log" gnome-terminal 线,但它坏了。我也尝试过,gnome-terminal -- "@server >> server.log"但也失败了。我无法找出让新 shell 运行服务器命令的答案将输出导出到日志文件。

在 Debian 12 上运行。

答案1

更好的方法是使用类似screentmux的东西,以便在关闭终端窗口时服务继续运行。然而,这不是你问的......

gnome-terminal -- "$server 2>&1 | tee server.log"

这几乎是正确的。我们来看看文档 ( man gnome-terminal)

gnome-terminal [OPTION…] [-- PROGRAM [ARG…]]

而且,有点令人困惑的是,

--command, -e=COMMAND以与 shell 相同的方式将此选项的参数拆分为程序和参数,并在终端内执行生成的命令行。此选项已弃用。相反,应使用--来终止选项,并将程序和参数放在其后执行:例如,不使用gnome-terminal -e "python3 -q",而是更喜欢使用gnome-terminal -- python3 -q

到目前为止一切顺利。但,

请注意,它COMMAND不是通过 shell 运行:它被分割成单词并作为程序执行。如果需要 shell 语法,请使用以下形式gnome-terminal -- sh -c '...'

最后一段是关键:你不能直接使用|and ;你必须调用 shell 来解释它:>gnome-terminal

$server="$game_path/server_executable"
gnome-terminal -- sh -c "$server 2>&1 | tee server.log"

就我个人而言,我更喜欢使用screen, 有或没有gnome-terminal

gnome-terminal -- screen sh -c 'game_path/server_executable 2>&1 | tee server.log'

或者,如果您真的不想要该gnome-terminal部分,而它只是启动游戏服务器的一种方法,

screen -md sh -c 'game_path/server_executable 2>&1 | tee server.log'

很多帮助在 U&L 上用于操纵screen会话,例如我的答案在 Ubuntu 中的单独屏幕中暂停进程并将其带回前台

相关内容