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


88

我之前已经搜索过,但从未找到答案。

在Windows中,如果打开控制台窗口,键入winmine,然后按Enter,将出现Minesweeper,它与cmd程序完全分开。我知道,Minesweeper实例不以任何方式绑定到命令提示符,除了将Minesweeper的父级设置为该命令提示符实例。但是,在Linux中有所不同。

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

谢谢!


1
Dup

请给出怪胎龙的答案。
Joshua Robison 2015年

在Windows7中,它是minesweeper.exe,在这里C:\ Program Files \ Microsoft Games \ Minesweeper,所以minesweeper.exe通常将无法工作..因为该目录不在路径中。而且无论如何,您应该声明Windows版本
barlop

Answers:


10

在中bashdetach是一个内置的,使用方式如下:

emacs &
detach %+ # or % + the number in brackets printed after the above

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

emacs &|

108

附加&到命令行:

emacs &

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

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

(emacs &)

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

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

(emacs &> /dev/null &)

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

1
如果您已经开始执行任务(emancs),则使用CTRL-Z进入睡眠状态,然后使用命令“ bg”发送到后台。
Jayan 2010年

@StackTrace:如果这样做,并且关闭终端,它也会杀死emacs。
内森·费尔曼

1
OK ..我以前用“ nohup”分离了这个。该过程一旦开始就无法完成...
Jayan

在终端窗口中按Ctrl+时C,发出此命令,该过程被杀死:<
Richard de Wit

21

使用nohup。像这样:nohup amarok &

希望这可以帮助。


19

我发布一个针对类似主题的较早主题的答案,其中包含来自各种来源的答案。以下是适合该主题的答案的副本。


以下作品:

$ (gui_app &> /dev/null &)

这是Nathan Fellman的答案以及重定向。

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

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

例如,

$ gui_app &> /dev/null &

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

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

$ gui_app &
$ disown

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

一些参考: 取消进程(UNIX Power Tools)

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

注意:CarlF在其他线程报告的注释中,通过“ gui_app&”方法启动的GUI应用程序从父终端退出时不会关闭。我认为我们正在以不同方式关闭终端。我正在关闭运行终端仿真器的窗口。我认为他可能已经通过外壳退出了终端仿真器(退出命令或Ctrl-D)。我对此进行了测试,发现通过bash退出并不会像GUI所说的那样终止GUI作为终端的后台进程而启动。当有机会清理时,bash似乎将后台进程移交给了init。实际上,这必须是将在子外壳程序中启动的后台进程移交给init的机制。


11

util-linux包含一个名为setsid的工具,该工具基本上可以完成detach的工作:

$ setsid someprogram

这将someprogram在新会话中运行。


9

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

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

您还可以:

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

7

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

#!/bin/bash
nohup "$@" &>/dev/null & disown %%

那你就可以做sbg emacs。您还可以将任何参数传递给:sbg emacs --daemon FILE1 FILE2


脚本解决方案最适合我。谢谢!!尽管我(gui_app &> /dev/null &)改用了(@EMPraptor的答案)
Jimi Oke


3

如果您正在使用bash,则可以取消该过程:

% firefox &
% disown 


1

正如其他答案所说,您可以使用以下内容:

$ emacs &

如果忘记了&,只需按Ctrl-z然后使用bg

[1]+  Stopped                 emacs
$ bg
[1]+ emacs &
$

仅供参考:Ctrl-z停止emacs进程bg并发送到后台。


0

只是使用&in $ x &留下了附加到终端的过程,所以我选择了一个名为detach http://inglorion.net/software/detach/的小程序,我对此使用了别名,因为d它有点像,nohup但它没有留下日志文件用它来分离mupdfd mupdf x.pdf


0

把它放到你的~/.bashrc

debug_trap_skip()
{
    local cmd_type=$(type -t "$1")

    # Empty cmd_type is for inexistent command or variable definition, exclude them
    # and shell builtins except echo, set and env:
    [[ -z "$cmd_type" || "$cmd_type" = builtin && "$1" != echo && "$1" != set && "$1" != env ]] &&
        return 0

    return 1
}

debug_trap_x11()
{
    if ldd `which $1`|grep -q libX11
    then
        setsid "$@"
        return 0
    fi
    return 1
}

debug_trap()
{
    [[ -n "$COMP_LINE" ]] && return  # do nothing if completing
    [[ "$BASH_COMMAND" = "$PROMPT_COMMAND" ]] && return
    debug_trap_skip $BASH_COMMAND && return 0
    debug_trap_x11 $BASH_COMMAND && return 1

    return 0
}

shopt -s extdebug
trap debug_trap DEBUG

现在,您不必记住哪些程序是X11并对其进行特殊处理,因为它们会自动分离。请注意,这setsid要好于nohup最后一个阻止HUP信号,因为这不是您所需要的。

PS现在,您已经winmine准备好在Linux中使用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.