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

89

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

Wenn in Windows ein Konsolenfenster geöffnet ist winmine, geben Sie Folgendes ein und drücken Sie die Eingabetaste. Minesweeper wird vollständig unabhängig vom cmd-Programm 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 Folgendes ein emacsund 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!

Jason
quelle
Bitte geben Sie die Antwort an Geekosaurier.
Joshua Robison
in windows7 ist es minesweeper.exe hier C: \ Programme \ Microsoft Games \ Minesweeper, so dass minesweeper.exe im Allgemeinen nicht funktioniert .. da sich dieses Verzeichnis nicht im Pfad befindet .. Und auf
jeden Fall

Antworten:

10

In bash, detachist ein eingebautes, wie folgt verwendet:

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

In zshkönnen Sie in einem einzigen Vorgang Hintergrundinformationen hinzufügen und trennen:

emacs &|
Geekosaurier
quelle
108

Fügen Sie &auf der Kommandozeile:

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 &)
Nathan Fellman
quelle
9
Mir gefällt besonders der (emacs &) Tipp.
1
Wenn Sie die Aufgabe (emancs) bereits gestartet haben, können Sie sie mit STRG-Z in den Ruhezustand versetzen und anschließend mit dem Befehl "bg" in den Hintergrund senden.
Jayan
@StackTrace: Wenn Sie das tun und Ihr Terminal schließen, werden auch Emacs getötet.
Nathan Fellman
1
OK .. Früher habe ich "nohup" verwendet, um dies zu entfernen. Es kann nicht getan werden, sobald der Prozess gestartet ist ...
Jayan
Beim Drücken von Ctrl+ Cim Terminalfenster wurde dieser Befehl ausgegeben, der Prozess wird abgebrochen: <
Richard de Wit
21

Verwenden Sie nohup. So was:nohup amarok &

Hoffe das hilft.

NawaMan
quelle
19

Ich habe eine Antwort auf einen ä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 zum 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. (Obwohl das Terminal mit dem Befehl exit oder Strg-D durch Bash verlassen wird, kann Bash bereinigt werden, indem der Hintergrundprozess an init übergeben wird.)

"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 der 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: Prozesse ablehnen (UNIX Power Tools)

Wenn es ein einfacher Anruf auf eine GUI - Anwendung - ohne komplizierte Optionen und so - es scheint , einen Starter wie „gmrun“ mit oder dmenu (Warnung: laut Audio) ist auch 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- Berichte GUI-Apps, die über die Methode "gui_app &" gestartet wurden, werden 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 für das Terminal 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.

EMPraptor
quelle
11

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

$ setsid someprogram

Dies wird someprogramin einer neuen Sitzung ausgeführt.

Tonybaldwin
quelle
9

Versuchen Sie xemacs &, 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 GNU Screen
Borealid
quelle
7

Ich habe den folgenden Code in eine ausführbare Skriptdatei mit dem Namen "sbg" für "Silent Background" eingefügt. Es erledigt alle notwendigen Dinge, um das gestartete Programm vollständig von der Shell zu trennen: Leitet stdin, stdout und stderr von / nach um /dev/null, ignoriert Hangups, läuft im Hintergrund und trennt sich.

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

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

Ryan Thompson
quelle
Die Scripting-Lösung funktionierte am besten für mich. Vielen Dank!! obwohl ich (gui_app &> /dev/null &)stattdessen verwendet habe (@ EMPraptors Antwort)
Jimi Oke
3
command &

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

Jesse Dhillon
quelle
3

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

% firefox &
% disown 
JeffG
quelle
2

Sie können diese einzelne Zeile verwenden:

$ emacs & disown
Idham Perdameian
quelle
1

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

$ emacs &

Wenn Sie das &allerdings vergessen haben , drücken Sie einfach Ctrl-zund verwenden Sie bg:

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

Zu Ihrer Information: Ctrl-zStoppt den Emacs-Prozess und bgsendet in den Hintergrund.

MatthewD
quelle
0

nur unter Verwendung von &wie in $ x &verlässt das Verfahren an das Endgerät angebracht ich ein kleines Programm namens abgeholt detach http://inglorion.net/software/detach/ , die ich aliased haben , wie des ein bisschen wie ist nohupaber nicht hinter einer Protokolldatei verlassen i benutze es um mupdf abzutrennen :d mupdf x.pdf

Dan D.
quelle
0

Setzen Sie dies zu Ihrem ~/.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

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 dies setsidbesser ist als, nohupweil das letzte HUP-Signal blockiert, was nicht das ist, was Sie benötigen.

PS: Jetzt bist du winmineschon in Linux.

midenok
quelle