Jak czysto uruchomić aplikację GUI za pośrednictwem terminala?

78

Niektóre aplikacje GUI uruchamiają się płynnie za pomocą wiersza poleceń Terminala, ale niektóre nie, i powodują, że Terminal czeka na zakończenie aplikacji. Nawet wtedy niektórzy nie zwalniają wiersza poleceń.

Tajemniczy &sufiks ampersand wydaje się powodować, że terminal umieszcza proces w tle (ale nie jestem pewien, co się tam dzieje).

Czy istnieje sposób na uruchomienie aplikacji za pomocą terminala, aby nie było efektu „zawieszenia się”, podobnie jak uruchomienie czegoś za pomocą Alt+ F2?

Chciałbym, aby linia poleceń była ponownie dostępna natychmiast, bez niczego w tle i drukowania w terminalu.

Peter.O
źródło
Na prośbę htorque usunąłem jego odpowiedź, którą zaakceptowałeś. Czy mógłbyś wybrać inną odpowiedź (najpierw musisz odznaczyć htorque - powinien czaić się na dole strony na czerwono)
Oli
1
Metoda radzenia sobie z działającym już programem (opisana przez con-f-use) jest dobra w tej sytuacji, ale ponieważ moje podstawowe pytanie dotyczyło czystego uruchamiania bez bałaganu na terminalu , zaakceptowałem screen(wspomniany przez Oli i RobinJ). Jestem pod wrażeniem jego możliwości; po przeczytaniu o nim i wypróbowaniu go ... To wymaga jedynie wpisania: screen -d -m gedit(lub screen geditnastępnie Ctrl+a dodłączenia) ... i nadal mam pełny dostęp do widoku terminala gedit (dla komunikatów ostrzegawczych itp.) w dowolnym momencie, screen -rnawet jeśli w międzyczasie zamknąłem oryginalne okno terminala ...
Peter.O
BTW, niektóre rzeczy, które przypisujesz terminalowi, są faktycznie wykonywane przez powłokę, na przykład interpretując &przyrostek polecenia. Może to być pomocne w wyjaśnieniu: jaka jest różnica między terminalem, konsolą, powłoką i wierszem poleceń?
wjandrea,

Odpowiedzi:

17

W przypadku gedit po prostu cały czas mam otwartą kopię. Tak długo, jak masz uruchomioną kopię, uruchamianie geditpołączeń z terminala, a następnie zamykanie terminala nie zabije gedit.

W przypadku innych rzeczy to, co powiedzieliby inni ludzie, również zadziałałoby. Jestem fanem nohup... Ale jeśli potrzebujesz terminala, który możesz odłączyć, a następnie podłączyć ponownie, chcesz spojrzeć screen.

  1. Uruchom go w terminalu, a następnie uruchom coś, co powoduje ciągłe wypychanie danych wyjściowych. Korzystam z serwera deweloperskiego Django, ale irssinawet watch uptimedobre przykłady.
  2. Zabij terminal i uruchom nowy.
  3. Uruchom screen -ri BOOM, wróciłeś.

screenjest znacznie większy i można go połączyć z, byobuaby uzyskać lepszą jakość terminalu. Czytaj dalej.

Oli
źródło
To pierwszy prawdziwy wgląd, jaki ekran robi / może zrobić ... dzięki za końcówkę terminala ...
Peter.O
screen nie jest już dostępny, ale tmux może go zastąpić. (tmux, aby rozpocząć nową sesję tmux, ctrl + b, a następnie naciśnij d, aby deatach i tmux dołączyć, aby ponownie dołączyć)
Gman Smith
84

Załóżmy, geditże program, który chcesz uruchomić, jest odłączony (alias. „Disowned”, „disentangled”, „decoupled”). Istnieją różne sposoby, w zależności od tego, co chcesz zrobić dokładnie:

Program już działa

Zapierać się:

disown -hjest właściwą drogą, jeśli chcesz to zrobić z już działającym programem (tj. jeśli go zapomniałeś nohup). Najpierw musisz go zatrzymać za pomocą Ctrl+ Z. Następnie możesz umieścić w tle za pomocą bg [jobId](np bg 1.). Otrzymasz listę uruchomionych zadań wraz z ich zleceniem jobs. Następnie możesz oddzielić go od terminala za pomocą disown -h %[jobId]. Przykładowa sesja terminalowa:

$ gedit 
^Z
[1]+  Stopped                 gedit
$ jobs
[1]+  Stopped                 gedit
$ bg 1
[1]+ gedit &
$ disown -h %1
$ exit

Program jeszcze się nie rozpoczął

nohup

nohupnie zawsze jest obecny na wszystkich komputerach. Jeśli wiesz, że chcesz wcześniej odłączyć, użyjesz:

nohup gedit &

Może chcesz przekierować wyjście powłoki, jak również i swój program do źródła sygnału pseudo, więc: nohup ./myprogram > foo.out 2> bar.err < /dev/null &. Chcesz przekierować dane wyjściowe, aby nie drażnić się nimi lub użyć ich później. Dane wejściowe o wartości NULL mogą pomóc w zapobieganiu błędom w ssh.

Podkładka:

Możesz osiągnąć podobny efekt przez

$ (geany >/dev/null 2>&1 &)

Nawiasy otwierają nową podpowłokę, w której można uruchomić gedit. >/dev/null 2>&1Przekierowuje wyjście powłoki do nikąd (pomijanie wyjścia). A &na końcu umieszcza proces w tle.

Multipleksowanie terminali

Także multipleksowanie terminali przy użyciu ekranu lub Byobu . Zasadniczo uruchamiasz program we własnym terminalu. Naprawdę mogę polecić byobu również z innych powodów. Poniżej znajduje się lista skrótów boybu, które mogą się przydać przy pierwszych krokach:

Przydatny:

  • F2 Utwórz nowe okno
  • F3 Przejdź do następnego okna
  • F4 Przejdź do poprzedniego okna
  • F6 Odłącz od sesji i wyloguj się
  • Shift-F6 Odłącz się od sesji, ale nie wylogowuj się
  • F7 Wejdź w tryb przewijania / wyszukiwania
  • Ctrl-F5 Ponownie podłącz wszelkie gniazda SSH / GPG lub agentów

Mniej przydatne:

  • Shift-F2 Podziel ekran w poziomie
  • Ctrl-F2 Podziel ekran pionowo
  • Shift-F3 Przenieś fokus do następnego podziału
  • Shift-F4 Przenieś fokus na poprzedni podział
  • Shift-F5 Zwiń wszystkie podziały
  • F5 Odśwież wszystkie powiadomienia o stanie
  • F8 Zmień nazwę bieżącego okna
  • F9 Uruchom menu konfiguracji Byobu
  • F12 Klawisz Escape ekranu GNU
  • Alt-Pageup Przewiń historię tego okna
  • Alt-Pagedown Przewiń do przodu historię tego okna
  • Ctrl-a-! Włącz lub wyłącz wszystkie skróty klawiszowe Byobu

Demon „at” i inne

atjest fajnym, przydatnym, małym narzędziem do uruchamiania poleceń w zaplanowanym czasie. Można „nadużyć”, aby odłączyć polecenie od powłoki:

echo './myprogram myoption1 myoption2' | at now

Możesz także zajrzeć do setsidi start-stop-daemon, ale inne metody powinny wystarczyć.

dezorientować
źródło
Wskazówka: jeśli istnieje tylko jedno zadanie, identyfikator zadania jest opcjonalny, np. Zamiast bg %1ciebie możesz po prostu wpisać bg.
MasterMastic,
25

Tajemniczy sufiks ampersand „&” wydaje się powodować, że terminal umieszcza proces w tle ... (ale nie jestem pewien, co się tam dzieje).

Robi to i często jest tym, czego chcesz. Jeśli zapomnisz użyć &, możesz zawiesić program za pomocą ctrl-z, a następnie umieścić go w tle za pomocą polecenia bg - i nadal używać tej powłoki.

Stdin procesu, stdout i stderr procesu są nadal podłączone do terminala; możesz przekierować je z / do / dev / null lub dowolnego innego pliku (np. zapisać gdzieś log wyjściowy), zgodnie z potrzebami:

some-program </dev/null &>/dev/null &
# &>file is bash for 1>file 2>&1

Możesz zobaczyć proces w zadaniach, przenieść go z powrotem na pierwszy plan (polecenie fg) i wysłać sygnały (polecenie zabicia).

Niektóre programy graficzne odłączają się od terminala; w takim przypadku po uruchomieniu polecenia „normalnie” zauważysz, że uruchamia on program graficzny i „wychodzi”.


Oto krótki skrypt , który możesz umieścić w ~ / bin , który nazwałem runbg:

#!/bin/bash
[ $# -eq 0 ] && {  # $# is number of args
  echo "$(basename $0): missing command" >&2
  exit 1
}
prog="$(which "$1")"  # see below
[ -z "$prog" ] && {
  echo "$(basename $0): unknown command: $1" >&2
  exit 1
}
shift  # remove $1, now $prog, from args
tty -s && exec </dev/null      # if stdin is a terminal, redirect from null
tty -s <&1 && exec >/dev/null  # if stdout is a terminal, redirect to null
tty -s <&2 && exec 2>&1        # stderr to stdout (which might not be null)
"$prog" "$@" &  # $@ is all args

Sprawdzam program ($ prog) przed przekierowaniem, aby można było zgłaszać błędy w jego zlokalizowaniu. Uruchom jako „runbg your-command args ...”; nadal możesz przekierować stdout / err do pliku, jeśli chcesz gdzieś zapisać dane wyjściowe.

Z wyjątkiem przekierowań i obsługi błędów jest to odpowiednik odpowiedzi htorque .

Społeczność
źródło
Okej, dzięki ... Wygląda na to, że ctrl-z(zawieszenie) daje mi dostęp do wiersza poleceń, ale wykasowuje GUI, dopóki nie bgwydaję, co wydaje się cofać zawieszenie. (ma sens) ... Czy jest jeszcze jedno polecenie, za pomocą którego mogę odłączyć GUI ... Aha! Rozumiem teraz, co masz na myśli przez sighals (kill command)... (ciekawe rzeczy, te sygnały) .. Użyłem fragmentu kodu, aby ddstopniowo generować statystyki ... i użyłem kill+ SYGNAŁU ... Czy jest jakiś SYGNAŁ do odłączenia "zadania „?
Peter.O
Właśnie zauważyłem twój komentarz do odpowiedzi Ricka ... Próbowałem disown zadania -p gedit`` i wyglądało na to, że usunąłem zadanie .... (ale dostałem komunikaty systemowe w terminalu, kiedy ręcznie zamknąłem gedit ... ale myślę, że Mam w tej chwili
spieprzony
@fred: Zadaniami zarządza powłoka, więc żaden sygnał nie może tego kontrolować. Może się okazać, że najlepiej jest uruchomić kilka powłok - kilka terminali GUI pozwala na zakładki i możesz używać screena lub tmuxa.
2
@ fred: lepiej nie uruchamiaj, jobs -p commandjeśli w tle działa wiele instancji jednego polecenia. możesz użyć, jobsaby znaleźć odpowiedni identyfikator zadania, a następnie zrobić, jobs -p <job-id>aby uzyskać PID zadania. Osobiście uważam wersję z podpowłoką za znacznie łatwiejszą. ;-)
htorque
2
@htorque, fred: Możesz uruchomić disown bez parametrów, aby bash odrzucił ostatnie zadanie:gedit & disown
22

Aby uruchomić aplikację i odłączyć ją od uruchomionego terminala, użyj & !.

firefox &!
Stóg
źródło
6
Dobrze wiedzieć, ale wydaje się, że to tylko zsh. W bash będziesz musiał uruchomić ręcznie disown <pid-of-command>po uruchomieniu polecenia w tle.
htorque
Interesujące ...
Zajmę się Zsh
co robi wykrzyknik?
orzechowy o natty
1
The! spowoduje przerwanie procesu aplikacji od procesu terminalu, aby można było zamknąć terminal bez uruchamiania aplikacji po zamknięciu. To wydaje się być zsh, ale przydatne.
Rick
Ale zadziałało to również w bash @ htorque ... Więc myślę, że to nie problem.
Jasser
20

Posługiwać się nohup

nohup to program, który uruchamia dane polecenie z ignorowanymi sygnałami zawieszenia, dzięki czemu polecenie może kontynuować działanie w tle po zakończeniu procesu nadrzędnego. Zobacz stronę podręcznika

Na przykład:

nohup gedit something
Florian Diesch
źródło
2
Co to jest nohup? Proszę opracować.
Oxwivi
3
nohup to program, który uruchamia dane polecenie z ignorowanymi sygnałami zawieszenia, dzięki czemu polecenie może kontynuować działanie w tle po zakończeniu procesu nadrzędnego. Zobacz manpage
Florian Diesch
Właściwie myślę, że moja odpowiedź jest tutaj niepoprawna. Po dalszych przemyśleniach nohupnależy zastosować w tym scenariuszu.
boehj
2
Gdy powłoka interaktywna odbiera sygnał SIGHUP, może wysłać (lub nie, w zależności od ustawień) sygnał SIGHUP do wszystkich swoich dzieci. Może się to zdarzyć (lub nie ponownie), gdy terminal jest zamknięty. Dziecko, które nie jest gotowe do obsługi takiego sygnału, wykona akcję domyślną, tj. Wyjdzie. nohupAplikacji (a disownwbudowane bash) nie pozwalają na sygnał, aby osiągnąć aplikację.
enzotib
2
Jedną z rzeczy, na które należy uważać, jest nohuputworzenie pliku w bieżącym katalogu o nazwie nohup.out. Zobacz stronę podręcznika, aby uzyskać więcej informacji. Wolę disownz tego powodu i dlatego, że disowndziała po uruchomieniu gedit.
Flimm
4

Otwórz terminal, wpisz screen , wpisz polecenie, które chcesz uruchomić, zamknij terminal. Program powinien nadal działać w sesji GNU Screen .

RobinJ
źródło
Czym dokładnie jest ekran GNU?
Oxwivi
Jeśli dobrze rozumiem, jest to rodzaj menedżera okien dla wiersza poleceń. Pozwala na uruchomienie więcej niż jednego programu jednocześnie w sesji interfejsu wiersza poleceń.
RobinJ
Byobu?
Oxwivi
Coś takiego, tylko Byobu jest łatwiejszy w użyciu. Jeśli się nie mylę, Byobu to po prostu łatwiejszy interfejs dla GNU Screen.
RobinJ
1

To działało dla mnie:

$ (nohup gedit 2>/dev/null &)
wesleycoder
źródło
1

xdg-open

Zobacz to narzędzie ogólnego zastosowania: https://linux.die.net/man/1/xdg-open

Spowoduje to otwarcie względnej lokalizacji w menedżerze plików.

 $ xdg-open .

Spowoduje to otwarcie pliku pdf w czytniku pdf.

 $ xdg-open foo.pdf

Możesz nawet podać adresy URL

$ xdg-open www.google.com
Jonathan Komar
źródło
0

Jak wielu ludzi uznało, nie należy brać pod uwagę niczego. Ale nic nie zatrzymuje się na terminalu i wyświetla irytującą aktywność programu na terminalu. Możesz po prostu zamknąć terminal, aby tego uniknąć. Odkryłem bardzo proste obejście, którego używam.

nohup gedit & exit

I to wszystko. Otwiera gedit i zamyka terminal po uruchomieniu gedit. Ponieważ gedit nie jest teraz powiązany z terminalem, pozostaje aktywny.

Lokesh Devnani
źródło
0

Działa to nawet wewnątrz skryptu (podobnie jak aliasy, zwiastun „&” zwykle nie jest dozwolony w skryptach, ponieważ nie są interaktywne):

bash -i >/dev/null 2>&1 <<<'nohup gedit &'
Sam
źródło
0

To działało dla mnie:

$ (some-program &) &>/dev/null

# Examples:
$ (gedit &) &>/dev/null
$ (google-chrome &) &>/dev/null
Eyal Levin
źródło