如何从命令行启动 GUI linux 程序,但与命令行分开?

Jas*_*son 91 linux command-line

我以前搜索过这个,但一直找不到答案。

在 Windows 中,如果我打开了一个控制台窗口,输入winmine,然后按回车键,就会出现扫雷器,完全独立于 cmd 程序。Minesweeper 实例不以我所知道的任何方式绑定到命令提示符,除了 Minesweeper 的父级被设置为命令提示符的那个实例。然而,在 Linux 中则不同。

在 Linux 中,如果我打开了一个控制台窗口,输入emacs并按 Enter,Emacs 将打开,但它似乎与命令行相关联。具体来说,在该 Emacs 实例关闭之前,我似乎无法再使用命令行。有没有办法在 Linux 中复制 Windows 行为?

谢谢!

Nat*_*man 112

附加&到命令行:

emacs &
Run Code Online (Sandbox Code Playgroud)

这会将 emacs 置于后台并使您能够继续使用终端。

请注意,这仍会将 emacs 保留为终端的子进程,并且当您退出终端时,它也会退出 emacs。为避免这种情况,请键入:

(emacs &)
Run Code Online (Sandbox Code Playgroud)

括号告诉终端从终端分离 emacs 进程。

尽管如此,来自程序的 stdout 和 stderr 消息仍将显示在终端上。为了防止这种情况,请使用:

(emacs &> /dev/null &)
Run Code Online (Sandbox Code Playgroud)

  • 我特别喜欢 (emacs &) 提示。 (9认同)

小智 21

使用nohup. 像这样:nohup amarok &

希望这可以帮助。


小智 19

我发布一个类似主题的旧线程的答案,其中包含来自各种来源的答案。以下是适用于该线程的该答案的副本。


以下作品:

$ (gui_app &> /dev/null &)
Run Code Online (Sandbox Code Playgroud)

这是 Nathan Fellman 的回答加上重定向。

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

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

例如,

$ gui_app &> /dev/null &
Run Code Online (Sandbox Code Playgroud)

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

“nohup”按照 NawaMan 的建议工作,但默认情况下会将输出和错误重定向到文件。正如 JeffG 所回答的那样,“disown”命令(如果在 shell 中可用)可以在您启动后台进程后从终端分离进程:

$ gui_app &
$ disown
Run Code Online (Sandbox Code Playgroud)

(顺便说一句,所有这些都适用于 bash。我确定其他 shell 有其他方法/语法来执行此操作。)

一些参考: 拒绝进程(UNIX Power Tools)

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

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


gee*_*aur 12

bash,detach是一个内置的,使用如下:

emacs &
detach %+ # or % + the number in brackets printed after the above
Run Code Online (Sandbox Code Playgroud)

在 中zsh,您可以在单个操作中进行后台和分离:

emacs &|
Run Code Online (Sandbox Code Playgroud)


小智 11

util-linux 包含一个名为 setsid 的工具,它基本上完成 detach 所做的事情:

$ setsid someprogram
Run Code Online (Sandbox Code Playgroud)

这将someprogram在新会话中运行。


Bor*_*lid 9

尝试键入xemacs &以在后台打开 XEmacs。

请不要将此称为“模拟 Windows 行为”。哎哟。

你也可以:

  • 打开一个新终端
  • 使用 Alt+F2 或您的窗口管理器启动程序,而不是使用终端
  • 使用 GNU 屏幕


Rya*_*son 7

我将以下代码放在一个名为“sbg”的可执行脚本文件中,用于“静音背景”。它完成所有必要的事情以完全断开正在启动的程序与 shell 的连接:重定向 stdin、stdout 和 stderr from/to /dev/null、忽略挂断、在后台运行和分离。

#!/bin/bash
nohup "$@" &>/dev/null & disown %%
Run Code Online (Sandbox Code Playgroud)

然后你就可以了sbg emacs。您还可以通过任何你想要的参数:sbg emacs --daemon FILE1 FILE2


归档时间:

查看次数:

122958 次

最近记录:

5 年 前