Jak uruchamiać programy linux GUI z wiersza poleceń, ale oddzielnie od wiersza poleceń?

89

Szukałem tego wcześniej, ale nigdy nie byłem w stanie znaleźć odpowiedzi.

W systemie Windows, jeśli mam otwarte okno konsoli, wpisz winminei naciśnij klawisz Enter, pojawi się Saper, całkowicie oddzielony od programu cmd. Instancja Saper nie jest powiązana z wierszem poleceń w żaden sposób, o którym wiem, z wyjątkiem tego, że rodzic Saper jest ustawiony na tę instancję wiersza polecenia. W Linuksie jest jednak inaczej.

W systemie Linux, jeśli mam otwarte okno konsoli, wpisz emacsi naciśnij klawisz Enter, Emacs otworzy się, ale wygląda na to, że jest związany z wierszem poleceń. W szczególności wydaje się, że nie mogę już używać wiersza poleceń, dopóki ta instancja Emacsa nie zostanie zamknięta. Czy istnieje sposób replikacji zachowania systemu Windows w systemie Linux?

Dzięki!

Jason
źródło
proszę dać odpowiedź geekozaurowi.
Joshua Robison
w Windows7 jest to minesweeper.exe tutaj C: \ Program Files \ Microsoft Games \ Minesweeper, więc minesweeper.exe zazwyczaj nie działa .. ponieważ ten katalog nie znajduje się na ścieżce .. W każdym razie powinieneś podać wersję systemu Windows
barlop

Odpowiedzi:

10

W bash, detachjest wbudowany, używany w następujący sposób:

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

W jednym zshtle możesz rozdzielić tło i odłączyć:

emacs &|
geekozaur
źródło
108

Dołącz &do wiersza poleceń:

emacs &

Spowoduje to umieszczenie emacsa w tle i umożliwi dalsze korzystanie z terminala.

Zauważ, że nadal pozostawi to emacsa jako podproces terminala, a kiedy wyjdziesz z terminala, również opuści emacs. Aby tego uniknąć, wpisz:

(emacs &)

Nawiasy nakazują terminalowi odłączyć proces emacs od terminala.

Mimo to komunikaty stdout i stderr z programu będą wyświetlane na terminalu. Aby temu zapobiec, użyj:

(emacs &> /dev/null &)
Nathan Fellman
źródło
9
Szczególnie podoba mi się wskazówka (emacs &).
1
jeśli już uruchomiłeś zadanie (emancs), użyj CTRL-Z, aby przejść w tryb uśpienia, a następnie użyj polecenia „bg”, aby wysłać do tła.
Jayan
@StackTrace: jeśli to zrobisz i zamkniesz terminal, zabije także emacsa.
Nathan Fellman
1
OK .. Kiedyś używałem „nohup”, odłącz to. Nie można tego zrobić po rozpoczęciu procesu ...
Jayan
Po naciśnięciu Ctrl+ Cw oknie terminala wydano to polecenie, proces zostaje zabity: <
Richard de Wit
21

Użyj nohup. Lubię to:nohup amarok &

Mam nadzieję że to pomoże.

NawaMan
źródło
19

Zamieściłem odpowiedź do starszego wątku o podobnym temacie z odpowiedziami z różnych źródeł. Poniżej znajduje się kopia tej odpowiedzi dostosowana do tego wątku.


Następujące prace:

$ (gui_app &> /dev/null &)

To jest odpowiedź Nathana Fellmana plus przekierowanie.

„&> / dev / null” przekierowuje zarówno stdout, jak i stderr do urządzenia zerowego. Ostatni znak amp powoduje, że proces działa w tle. Nawiasy wokół polecenia spowodują uruchomienie „gui_app” w podpowłoce.

Spowoduje to odłączenie procesu „gui_app” od konsoli, z której wykonasz to polecenie. Więc nawet jeśli zamkniesz okno, w którym działa emulator terminala nadrzędnego, „gui_app” się nie zamknie. Uruchomiłem to, potem spojrzałem na drzewo procesów za pomocą polecenia „pstree” i stwierdziłem, że aplikacja uruchomiona w ten sposób stanie się procesem potomnym do „init”.

Na przykład,

$ gui_app &> /dev/null &

uruchomi aplikację w tle, ale stanie się potomnym procesem konsoli i zakończy się po zamknięciu terminalu. (Chociaż wyjście z terminala przez bash za pomocą polecenia exit lub Ctrl-D pozwoli bashowi wyczyścić przekazując proces w tle do inicjalizacji.)

„nohup” działa zgodnie z sugestią NawaMan, ale domyślnie przekierowuje wyjście i błąd do pliku. Jak odpowiedział JeffG, polecenie „disown” (jeśli jest dostępne w powłoce) może odłączyć proces od terminala po uruchomieniu procesu w tle:

$ gui_app &
$ disown

(BTW wszystko to dotyczy bash. Jestem pewien, że inne powłoki mają do tego inne metody / składnię).

Niektóre odniesienia: odrzucanie procesów (UNIX Power Tools)

Jeśli jest to zwykłe wywołanie aplikacji GUI - bez skomplikowanych opcji i podobnych - wydaje się, że dobrym pomysłem jest użycie programu uruchamiającego takiego jak „gmrun” lub dmenu (ostrzeżenie: głośny dźwięk). Powiąż go z kluczową kombinacją. Nie używam jeszcze programu uruchamiającego, ale wypróbowałem te dwa.

UWAGA: CarlF w komentarzach do innych raportów wątków Aplikacje GUI uruchomione za pomocą metody „gui_app &” nie zamykają się po wyjściu z terminala nadrzędnego. Myślę, że zamykaliśmy terminal na różne sposoby. Zamykałem okno, w którym działał emulator terminala. Myślę, że mógł wyjść z emulatora terminala przez powłokę (polecenie exit lub Ctrl-D). Przetestowałem to i zobaczyłem, że wyjście przez bash nie zatrzymuje GUI uruchomionego jako proces w tle terminala, jak mówi CarlF. Wydaje się, że nie trzeba uruchamiać procesów działających w tle, aby dać szansę oczyszczenia. W rzeczywistości musi to być mechanizm, za pomocą którego proces w tle rozpoczęty w podpowłoce zostaje przekazany do inicjowania.

EMPraptor
źródło
11

util-linux zawiera narzędzie o nazwie setsid, które zasadniczo robi to, co robi odłączanie:

$ setsid someprogram

To będzie działać someprogramw nowej sesji.

tonybaldwin
źródło
9

Spróbuj wpisać xemacs &XEmacs w tle.

Nie nazywaj tego „emulowaniem zachowania Windows”. Ojej.

Możesz także:

  • Otwórz nowy terminal
  • Użyj Alt + F2 lub menedżera okien, aby uruchomić program, zamiast korzystać z terminala
  • Użyj ekranu GNU
Borealid
źródło
7

Umieszczam następujący kod w wykonywalnym pliku skryptu o nazwie „sbg” dla „cichego tła”. Robi wszystkie niezbędne rzeczy, aby całkowicie odłączyć uruchamiany program od powłoki: przekierowuje stdin, stdout i stderr z / do /dev/null, ignoruje zawieszanie się, działa w tle i odłącza się.

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

Więc możesz po prostu zrobić sbg emacs. Można również przekazać żadnych argumentów, które mają być: sbg emacs --daemon FILE1 FILE2.

Ryan Thompson
źródło
rozwiązanie skryptowe działało dla mnie najlepiej. dzięki!! chociaż (gui_app &> /dev/null &)zamiast tego użyłem (odpowiedź EMPraptora)
Jimi Oke,
3
command &

Po komendzie wstaw znak ampersand.

Jesse Dhillon
źródło
3

jeśli używasz bash, możesz odrzucić proces:

% firefox &
% disown 
JeffG
źródło
2

Możesz użyć tej pojedynczej linii:

$ emacs & disown
Idham Perdameian
źródło
1

Jak mówią inne odpowiedzi, możesz użyć następujących opcji:

$ emacs &

Jeśli jednak zapomnisz &, po prostu naciśnij, Ctrl-za następnie użyj bg:

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

FYI: Ctrl-zzatrzymuje proces emacsa i bgwysyła w tle.

MatthewD
źródło
0

po prostu używając &jak w $ x &liście proces dołączony do terminala wziąłem mały program o nazwie detach http://inglorion.net/software/detach/, który mam alias, ponieważ djest trochę podobny, nohupale nie pozostawia pliku dziennika i użyj go, aby odłączyć mupdf :d mupdf x.pdf

Dan D.
źródło
0

Umieść to w swoim ~/.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

Teraz nie musisz pamiętać, które programy to X11 i wykonywać dla nich specjalne manipulacje, ponieważ zostaną one odłączone automatycznie. Zauważ, że setsidjest to lepsze niż nohupponieważ ostatni blokuje sygnał HUP, który nie jest tym, czego potrzebujesz.

PS Teraz jesteś winminew Linuksie.

midenok
źródło