Szukałem tego wcześniej, ale nigdy nie byłem w stanie znaleźć odpowiedzi.
W systemie Windows, jeśli mam otwarte okno konsoli, wpisz winmine
i 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 emacs
i 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!
źródło
Odpowiedzi:
W
bash
,detach
jest wbudowany, używany w następujący sposób:W jednym
zsh
tle możesz rozdzielić tło i odłączyć:źródło
Dołącz
&
do wiersza poleceń: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:
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:
źródło
Ctrl
+C
w oknie terminala wydano to polecenie, proces zostaje zabity: <Użyj
nohup
. Lubię to:nohup amarok &
Mam nadzieję że to pomoże.
źródło
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:
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,
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:
(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.
źródło
util-linux zawiera narzędzie o nazwie setsid, które zasadniczo robi to, co robi odłączanie:
To będzie działać
someprogram
w nowej sesji.źródło
Spróbuj wpisać
xemacs &
XEmacs w tle.Nie nazywaj tego „emulowaniem zachowania Windows”. Ojej.
Możesz także:
źródło
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ę.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
.źródło
(gui_app &> /dev/null &)
zamiast tego użyłem (odpowiedź EMPraptora)Po komendzie wstaw znak ampersand.
źródło
jeśli używasz bash, możesz odrzucić proces:
źródło
Możesz użyć tej pojedynczej linii:
źródło
Jak mówią inne odpowiedzi, możesz użyć następujących opcji:
Jeśli jednak zapomnisz
&
, po prostu naciśnij,Ctrl-z
a następnie użyjbg
:FYI:
Ctrl-z
zatrzymuje proces emacsa ibg
wysyła w tle.źródło
po prostu używając
&
jak w$ x &
liście proces dołączony do terminala wziąłem mały program o nazwiedetach
http://inglorion.net/software/detach/, który mam alias, ponieważd
jest trochę podobny,nohup
ale nie pozostawia pliku dziennika i użyj go, aby odłączyć mupdf :d mupdf x.pdf
źródło
Umieść to w swoim
~/.bashrc
:Teraz nie musisz pamiętać, które programy to X11 i wykonywać dla nich specjalne manipulacje, ponieważ zostaną one odłączone automatycznie. Zauważ, że
setsid
jest to lepsze niżnohup
ponieważ ostatni blokuje sygnał HUP, który nie jest tym, czego potrzebujesz.PS Teraz jesteś
winmine
w Linuksie.źródło