it-swarm.com.de

Wie starte ich GUI-Linux-Programme von der Kommandozeile aus, aber getrennt von der Kommandozeile?

Ich habe schon einmal danach gesucht, aber noch nie eine Antwort gefunden.

Wenn in Windows ein Konsolenfenster geöffnet ist, geben Sie winmine ein, und drücken Sie die Eingabetaste. Minesweeper wird vollständig vom cmd-Programm getrennt angezeigt. Die Minesweeper-Instanz ist in keiner mir bekannten Weise an die Eingabeaufforderung gebunden, mit Ausnahme des übergeordneten Elements von Minesweeper, das auf diese Instanz der Eingabeaufforderung festgelegt ist. Unter Linux ist das jedoch anders.

Wenn unter Linux ein Konsolenfenster geöffnet ist, geben Sie emacs ein und drücken Sie die Eingabetaste. Emacs wird geöffnet, scheint jedoch an die Befehlszeile gebunden zu sein. Insbesondere scheint es, dass ich die Befehlszeile nicht mehr verwenden kann, bis diese Instanz von Emacs geschlossen ist. Gibt es eine Möglichkeit, das Windows-Verhalten unter Linux zu replizieren?

Vielen Dank!

86
Jason

In bash ist detach eine integrierte Funktion, die wie folgt verwendet wird:

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

In zsh können Sie in einer einzigen Operation Hintergrundinformationen hinzufügen und die Verbindung trennen:

emacs &|
10
geekosaur

Hänge & an die Kommandozeile an:

emacs &

Dadurch wird der Emacs in den Hintergrund gestellt und Sie können Ihr Terminal weiterhin verwenden.

Beachten Sie, dass Emacs weiterhin als Unterprozess Ihres Terminals verbleibt. Wenn Sie das Terminal verlassen, wird auch Emacs beendet. Um dies zu vermeiden, geben Sie Folgendes ein:

(emacs &)

Die Klammern weisen das Terminal an, den Emacs-Prozess vom Terminal zu trennen.

Auf dem Terminal werden weiterhin Standard- und Standardnachrichten des Programms angezeigt. Um dies zu verhindern, verwenden Sie:

(emacs &> /dev/null &)
107
Nathan Fellman

Verwenden Sie Nohup. Wie folgt: Nohup amarok &

Hoffe das hilft.

19
NawaMan

Ich habe eine Antwort zu einem älteren Thread mit ähnlichen Themen mit Antworten aus verschiedenen Quellen gepostet. Es folgt eine Kopie dieser Antwort, die für diesen Thread angepasst wurde.


Folgende Arbeiten:

$ (gui_app &> /dev/null &)

Dies ist die Antwort von Nathan Fellman plus Weiterleitung.

"&>/dev/null" leitet sowohl stdout als auch stderr auf das null-Gerät um. Das letzte kaufmännische Und bewirkt, dass der Prozess im Hintergrund ausgeführt wird. Die Klammern um den Befehl führen dazu, dass "gui_app" in einer Subshell ausgeführt wird.

Dadurch wird der "gui_app" -Prozess von der Konsole getrennt, von der aus Sie diesen Befehl ausführen. Selbst wenn Sie das Fenster schließen, in dem der übergeordnete Terminalemulator ausgeführt wird, wird "gui_app" nicht geschlossen. Ich habe dies ausgeführt und dann den Prozessbaum mit dem Befehl "pstree" angesehen und festgestellt, dass eine auf diese Weise gestartete Anwendung ein untergeordneter Prozess für "init" wird.

Zum Beispiel,

$ gui_app &> /dev/null &

führt die Anwendung im Hintergrund aus, wird jedoch zu einem untergeordneten Prozess des Konsolenprozesses und wird beendet, wenn Sie das Terminal schließen. (Wenn Sie das Terminal mit dem Befehl exit oder Strg-D durch Bash verlassen, wird Bash bereinigt, indem Sie den Hintergrundprozess an init übergeben.)

"Nohup" funktioniert wie von NawaMan vorgeschlagen, leitet jedoch Ausgabe und Fehler standardmäßig in eine Datei um. Wie JeffG geantwortet hat, kann der Befehl "disown" (falls in Shell verfügbar) den Prozess vom Terminal trennen, nachdem Sie einen Hintergrundprozess gestartet haben:

$ gui_app &
$ disown

(Übrigens gilt das alles für Bash. Ich bin sicher, dass andere Shells andere Methoden/Syntax haben, um dies zu tun.)

Einige Verweise: Ablehnen von Prozessen (UNIX Power Tools)

Wenn es sich um einen einfachen Aufruf einer GUI-Anwendung handelt - ohne komplizierte Optionen und dergleichen -, ist die Verwendung eines Startprogramms wie "gmrun" oder dmenu (Warnung: lauter Ton) ebenfalls eine gute Option. Binden Sie es an eine Tastenkombination. Ich benutze noch keinen Launcher, habe die beiden aber ausprobiert.

HINWEIS: CarlF in den Kommentaren der anderen Thread Reports-GUI-Apps, die über die Methode "gui_app &" gestartet wurden, wird nicht geschlossen, wenn er das übergeordnete Terminal verlässt. Ich denke, wir haben das Terminal auf verschiedene Arten geschlossen. Ich habe das Fenster geschlossen, in dem der Terminalemulator ausgeführt wurde. Ich glaube, er hat den Terminalemulator möglicherweise über die Shell verlassen (Befehl exit oder Strg-D). Ich habe dies getestet und festgestellt, dass das Beenden durch Bash die GUI nicht anhält, die als Hintergrundprozess des Terminals gestartet wurde, wie CarlF sagt. Es scheint, dass Bash-Hands-Off-Hintergrundprozesse initiiert werden, wenn die Möglichkeit zum Aufräumen besteht. Tatsächlich muss dies der Mechanismus sein, mit dem der in einer Subshell gestartete Hintergrundprozess an init übergeben wird.

18
EMPraptor

util-linux enthält ein Tool namens setsid, das im Grunde das tut, was detach tut:

$ setsid someprogram

Dadurch wird someprogram in einer neuen Sitzung ausgeführt.

10
tonybaldwin

Versuchen Sie, xemacs & einzugeben, um XEmacs im Hintergrund zu öffnen.

Bitte bezeichnen Sie dies nicht als "Windows-Verhalten emulieren". Autsch.

Du könntest auch:

  • Öffne ein neues Terminal
  • Verwenden Sie Alt + F2 oder Ihren Fenstermanager, um das Programm zu starten, anstatt das Terminal zu verwenden
  • Verwenden Sie den Bildschirm GNU
9
Borealid

Ich habe den folgenden Code in eine ausführbare Skriptdatei mit dem Namen "sbg" für "Silent Background" eingefügt. Das Programm, das gerade gestartet wird, wird vollständig von der Shell getrennt: Leitet stdin, stdout und stderr von/nach /dev/null um, ignoriert Aufhänge, wird im Hintergrund ausgeführt und trennt sich.

#!/bin/bash
Nohup "[email protected]" &>/dev/null & disown %%

Dann kannst du einfach sbg emacs machen. Sie können auch beliebige Argumente übergeben: sbg emacs --daemon FILE1 FILE2.

7
Ryan Thompson

wenn Sie Bash verwenden, können Sie den Prozess ablehnen:

% firefox &
% disown 
3
JeffG
command &

Fügen Sie nach dem Befehl ein kaufmännisches Und ein.

3
Jesse Dhillon

Sie können diese einzelne Zeile verwenden:

$ emacs & disown
2

Wie die anderen Antworten sagen, können Sie Folgendes verwenden:

$ emacs &

Wenn Sie den & vergessen haben, drücken Sie einfach Ctrl-z und verwenden Sie dann bg:

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

Zu Ihrer Information: Ctrl-z stoppt den Emacs-Prozess und bg sendet in den Hintergrund.

1
MatthewD

Tragen Sie dies in Ihren ~/.bashrc ein:

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 "[email protected]"
        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

Jetzt müssen Sie sich nicht mehr erinnern, welche Programme X11 sind, und spezielle Manipulationen für sie durchführen, da sie sich automatisch lösen. Beachten Sie, dass setsid besser ist als Nohup, da die letzte Variable das HUP-Signal blockiert. Dies ist nicht das, was Sie benötigen.

P.S. Jetzt sind Sie winmine- bereit für Linux.

0
midenok

wenn ich nur & wie in $ x & verwende, bleibt der Prozess mit dem Terminal verbunden. Ich habe ein kleines Programm namens detachhttp://inglorion.net/software/detach/ ausgewählt, das ich als d eingeteilt habe. Es ist ein bisschen wie Nohup, aber hinterlässt keine Protokolldatei Ich benutze sie, um mupdf zu trennen: d mupdf x.pdf

0
Dan D.