Uruchamianie programów w tle z terminala

136

Jak uruchomić program w tle powłoki, z możliwością zamknięcia powłoki, pozostawiając program uruchomiony? Powiedzmy, że mój interfejs ma problemy lub z jakiegoś powodu muszę uruchomić program z okna terminala, powiedzmy nm-applet:

nm-applet

Po uruchomieniu zajmuje pierwszy plan w oknie terminala.

Czy jest jakiś prosty sposób na uruchomienie programu w tle bez konieczności pozostawiania terminala otwartego lub zajmowania całego terminala?

W tej notatce znalazłem sposób na uruchamianie programów z terminala i umożliwienie innym wejściom, dodając &do polecenia jako znak ampersand ( ):

nm-applet &

Nie ma to jednak większego zastosowania, ponieważ wszelkie procesy uruchomione w terminalu są zabijane po zamknięciu terminala.                                                                        

OVERTONE
źródło
7
nohup „polecenie” i to wydaje się działać. Masz z tym jakieś problemy?
OVERTONE

Odpowiedzi:

173

Niedawno polubiłem setsid. Zaczyna wyglądać, jakbyś po prostu uruchamiał coś z terminala, ale możesz go odłączyć (zamknąć terminal) i po prostu działa dalej.

Wynika to z faktu, że polecenie faktycznie rozwidla się i podczas gdy dane wejściowe docierają do bieżącego terminala, są własnością zupełnie innego rodzica (który pozostaje przy życiu po zamknięciu terminala).

Przykład:

setsid gnome-calculator

Jestem również dość częściowy, do disownktórego można użyć, aby oddzielić proces od bieżącego drzewa. Używasz go w połączeniu ze znakiem tła i:

gnome-calculator & disown

Właśnie dowiedziałem się o spawnowaniu podpowłok z nawiasami. Ta prosta metoda działa:

(gnome-calculator &)

I oczywiście, nohupjak już wspomniałeś. Nie jestem szalony, nohupponieważ ma tendencję do pisania ~/nohup.outbez mojej prośby. Jeśli na tym polegasz, może być dla Ciebie.

nohup gnome-calculator

W przypadku procesów długoterminowych istnieją rzeczy takie jak screeni inne wirtualne multipleksery terminali, które utrzymują sesje między połączeniami. Te prawdopodobnie tak naprawdę nie dotyczą ciebie, ponieważ chcesz tymczasowo uzyskać dostęp do wyjścia terminala, ale jeśli chcesz wrócić trochę później i zobaczyć ostatnią aktywność terminala, ekran prawdopodobnie byłby najlepszym wyborem.

Internet jest pełen screensamouczków, ale oto prosty szybki start:

Oli
źródło
Oli, w przypadku DISPLAY =: 0 jedności - zastąp, którego z powyższych miałbyś użyć i dlaczego?
orzechowy o natty
4
@nuttyaboutnatty owinąć całe mnóstwo w swoim sesji powłoki: sh -c "sleep 10s && cvlc '/home/omm.ogg'" & disown. To właściwie moje rozwiązanie dla wszystkiego, aby upewnić się, że rozwidla się poprawnie.
Oli
1
@nuttyaboutnatty To właśnie mam na myśli, ale nie skończyłbyś z uruchomionymi dwoma instancjami, ponieważ --replacerobi to tak, jak to brzmi i faktycznie kończy starą instancję. Uruchomienie go po raz drugi z poziomu Xsession zakończy kopię związaną z TTYn i pozwoli ci użyć tego w przyszłości, jeśli będziesz go potrzebować. Jest prawdopodobnie lepszy sposób na zrobienie tego, ale właśnie to przychodzi mi do głowy za każdym razem, gdy tego potrzebuję.
Oli
1
Idealnie, ta, która działała dla mnie, to podpowłoka „(gnome-kalkulator i)”. Używam go do uruchamiania aplikacji konsoli mono w tle. W przypadku innych technik aplikacja mono natychmiast się zawiesiłaby.
Nikolaos Georgiou
2
Uwaga dla przyszłych użytkowników : tworzenie nohup.outmoże zostać stłumione poprzez przekierowanie stdout i sterr, aby /dev/nullpolubić:nohup firefox &> /dev/null &
Sergiy Kolodyazhnyy
55

Oto dwa sposoby, z którymi bym poszedł. Po pierwsze, nie uruchamiaj go z terminala; naciśnij Alt+, F2aby otworzyć okno dialogowe uruchamiania i uruchom je stamtąd (bez &).

Z terminalu uruchom

nm-applet &

Ale NIE zamykaj terminalu samodzielnie. Oznacza to, że nie naciskaj przycisku X, aby zamknąć i nie używaj opcji Plik -> Wyjdź z paska menu. Jeśli zamkniesz terminal w ten sposób, wyśle ​​sygnał HUP (Hang UP) do uruchomionej bash, co z kolei wyśle ​​sygnał HUP do wszystkich jego potomków (dlatego w tym przypadku nohup nie działa).

Zamiast tego wyjdź z powłoki, uruchamiając exitlub naciskając Ctrl+ D. bash następnie wyrzuci swoje elementy potomne, a następnie zakończy działanie, pozostawiając uruchomione procesy w tle. A kiedy bash zakończy działanie, terminal utracił proces potomny, więc również się zamknie.

Wszystko to naraz:

nm-applet & exit
geirha
źródło
To wspaniale! Nigdy o tym nie wiedziałem i wydajesz się być jedyną osobą, która o tym wspomina. Zdecydowanie takie jest moje ulubione podejście w środowisku Desktop. Szkoda, że ​​nie mogę głosować więcej; p
7hi4g0
Próbowałem tego z inną aplikacją i nie udało się: matlab & exitUruchomienie dwóch osobnych poleceń działało dobrze:matlab & exit
MattKelly,
Zastanawiałem się, dlaczego OP powiedział, że zamknięcie terminalu spowodowało awarię jego programów w tle. Nigdy nie próbowałem zamykać terminala przyciskiem „x” w oknie.
user1717828,
przycisk x to kill, to nie kończy czysto wyjścia, robi to polecenie exit. zamiast tego możesz ponownie przypisać przycisk x do polecenia wyjścia ...
Tim Baker,
14

Jak wskazałeś, możesz biegać

nohup nm-applet &  

aby zignorować sygnał końcowy podczas zamykania terminala. Nie ma z tym problemu.

desgua
źródło
Jakieś inne alternatywy? Dla samej
wiedzy
Na wikipedia ( en.wikipedia.org/wiki/Nohup ) jest sugestia, echo command | at nowktórej nie mogłem zmusić do działania.
desgua
2
Zastanawiam się, jak to działa z interfejsu użytkownika po dwukrotnym kliknięciu ikony lub programu.
OVERTONE
execstanowi alternatywę nohup <command> &dla uruchamiania procesu w tle i zwracania bieżącego polecenia powłoki.
JSStuball
12

Jednej rzeczy, której brakuje wielu innych odpowiedzi, jest to, jak odłączyć działający proces, który obecnie blokuje powłokę. W większości terminali i powłok Ctrl+ Zpowoduje zatrzymanie uruchomionego procesu i powrót do monitu o wprowadzenie danych. Następnie możesz wydać

bg

aby wysłać działający proces w tło. Kwestia

fg

zamiast tego umieścić uruchomiony proces z powrotem na pierwszym planie.

EDYCJA : Więcej szczegółów w tej odpowiedzi odkryłem później.

krlmlr
źródło
7

Użyj, (exec PROGRAM &> /dev/null & )aby zezwolić na przejęcie PID podpowłoki PROGRAM. Podejście to przetestowałem wiele razy w kilku różnych programach. Zamknięcie oryginalnego terminalu nie ma wpływu na nowo powstały program

Małe demo:

$ # this is before running
$ (exec firefox &> /dev/null &)
$ # and look, we still in side the terminal and can continue working
Sergiy Kolodyazhnyy
źródło
Hmmm (exec firefox)zawiesza terminal, dopóki nie opuszczę Firefoksa ... a zamknięcie terminala ZATRZYMUJE powłokę i podpowłokę
kosz
Zredagowałem swoją odpowiedź. Testowałem to z kilkoma innymi programami. W tej wersji nie
widziałem firefoxa
działa dobrze dla mnie
Zanna
Nie sądzę, że użycie exec bash jest konieczne, być może z jakiegoś powodu potrzebujesz PID.
marinara
2

Mogę polecić terminal Byobu. Możesz łatwo odłączyć proces, naciskając klawisz F6.

speter
źródło
1

Chociaż powyżej są dobre odpowiedzi, chciałbym dać moje 2 centy za to, jak używam MATLAB w tle.

sudo -b matlab

-bTag sudo można uruchamiać aplikacje w tle. Możesz także zamknąć terminal po wykonaniu tego polecenia.

Prawdopodobnie niepowiązane, ale istnieje wspaniała strona internetowa, której można użyć do wyjaśnienia poleceń powłoki. http://explainshell.com/explain/8/sudo

użytkownik3342981
źródło
0

Nie wiem, czy to właściwa droga, ale właśnie rozpoczynam kolejną sesję, pozostawiając poprzednią samą. Na przykład uruchomiłem prosty serwer WWW na mojej malinie. web.py one. następnie rozpoczynam nową sesję, pozostawiając ją samą. Otóż ​​to. jest to również przydatne, ponieważ wciąż jesteś aktualizowany, nawet jeśli pracujesz nad drugą sesją.

Lew
źródło
2
Witamy w Ask Ubuntu! Zalecam edycję tej odpowiedzi, aby rozszerzyć ją o szczegółowe informacje na temat tego, jak to zrobić. (Zobacz także Jak napisać dobrą odpowiedź? Zawiera ogólne porady na temat tego, jakie rodzaje odpowiedzi są uważane za najcenniejsze w Ask Ubuntu.)
David Foerster,
0

W przypadku korzystania z KDE możesz także użyć tego kstart, co uruchomi twój program odłączony od terminala. Zapewnia również, że środowisko KDE jest poprawnie skonfigurowane dla polecenia. (Zobacz kstart.cppkod źródłowy w celach informacyjnych . Jak widzisz stamtąd używa KProcess::startDetached, KProcesspochodzi QProcessi startDetachedrozpoczyna nowy proces oraz odłącza się od niego).

Podobne jest również kde-openlub xdg-openlub gnome-open.

Albert
źródło
W tej chwili wygląda to bardziej na komentarz niż odpowiedź. Należy zmieniać się rozwijać. Nie dawaj tylko jednej linijki; wyjaśnij, dlaczego masz rację, najlepiej z cytatami. Odpowiedzi bez wyjaśnienia podlegają usunięciu.
anonimowy2