从 Linux 终端启动 GUI 程序可防止进一步使用

从 Linux 终端启动 GUI 程序可防止进一步使用

我想搜索这个,但我不知道如何向搜索引擎表达它。

基本上,当我从终端窗口启动 GUI 程序时,除非我退出该程序,否则该终端无法继续使用。我刚刚开始使用 dwm,我不想在启动几个图形程序后到处都是无用的终端。有什么办法可以解决这个问题吗?

答案1

每个人都说要使用“&”,这是对的。如果您忘记了,请键入 ^Z (ctrl+Z) 以暂停程序,然后键入“bg”以告诉 shell 在后台运行它。这样 shell 就可以完全交互,就像您使用“&”启动程序一样。

答案2

我意识到这是一个老话题,但我记得找到了一个比这里列出的更复杂的解决方案。

$ (gui_app &> /dev/null &)

“&> /dev/null” 将 stdout 和 stderr 重定向到空设备。最后一个 & 符号使进程在后台运行。命令周围的括号将使您的“gui_app”在子 shell 中运行。

执行此操作会将“gui_app”进程从您执行此命令的控制台中分离出来。因此,即使您关闭父终端仿真器正在运行的窗口,“gui_app”也不会关闭。我运行了此命令,然后使用“pstree”命令查看了进程树,发现以这种方式启动的应用程序将成为“init”的子进程。

例如,

$ gui_app &> /dev/null &

将在后台运行该应用程序,但它将成为控制台进程的子进程,并在您关闭终端时终止。(虽然使用 exit 命令或 Ctrl-D 通过 bash 退出终端将让 bash 通过将后台进程交给 init 进行清理。)

或者,您可以使用“nohup”,但它默认将输出和错误重定向到文件。启动后台进程后,“disown”命令(如果在 shell 中可用)可以将进程从终端分离:

$ gui_app &
$ disown

(顺便说一下,所有这些都适用于 bash。我相信其他 shell 有其他方法/语法可以做到这一点。)

类似的超级用户问答 - 也许我记得其中的一些答案:... 从命令行启动 GUI Linux 程序,但与命令行分开?

一些参考: 放弃进程(UNIX 强力工具)

如果只是简单地调用 GUI 应用程序(没有复杂的选项等),似乎可以使用“gmrun”或菜单(警告:声音很大)也是一个不错的选择。将其绑定到组合键。我还没有使用启动器,但尝试过这两个。

注意:评论中的 CarlF 报告说,当他退出父终端时,通过“gui_app &”方法启动的 GUI 应用程序不会关闭。我认为我们关闭终端的方式不同。我关闭了终端仿真器正在运行的窗口。我认为他可能通过 shell(exit 命令或 Ctrl-D)退出了终端仿真器。我对此进行了测试,发现通过 bash 退出不会停止作为终端后台进程启动的 GUI,正如 CarlF 所说。似乎 bash 在有机会清理时将后台进程移交给 init。事实上,这一定是在子 shell 中启动的后台进程移交给 init 的机制。

答案3

您需要像这样在后台启动该应用程序:

# xeyes &

&表示应用程序应在后台启动。

答案4

尝试

$>FooBargGui &

这将告诉 shell 启动 process/gui FooBarGui 作为后台进程并立即返回到提示符。

相关内容