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.
źródło
Odpowiedzi:
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:
Jestem również dość częściowy, do
disown
którego można użyć, aby oddzielić proces od bieżącego drzewa. Używasz go w połączeniu ze znakiem tła i:Właśnie dowiedziałem się o spawnowaniu podpowłok z nawiasami. Ta prosta metoda działa:
I oczywiście,
nohup
jak już wspomniałeś. Nie jestem szalony,nohup
ponieważ ma tendencję do pisania~/nohup.out
bez mojej prośby. Jeśli na tym polegasz, może być dla Ciebie.W przypadku procesów długoterminowych istnieją rzeczy takie jak
screen
i 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
screen
samouczków, ale oto prosty szybki start:źródło
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.--replace
robi 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ę.nohup.out
może zostać stłumione poprzez przekierowanie stdout i sterr, aby/dev/null
polubić:nohup firefox &> /dev/null &
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
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
exit
lub 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:
źródło
matlab & exit
Uruchomienie dwóch osobnych poleceń działało dobrze:matlab &
exit
Jak wskazałeś, możesz biegać
aby zignorować sygnał końcowy podczas zamykania terminala. Nie ma z tym problemu.
źródło
echo command | at now
której nie mogłem zmusić do działania.exec
stanowi alternatywęnohup <command> &
dla uruchamiania procesu w tle i zwracania bieżącego polecenia powłoki.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ć
aby wysłać działający proces w tło. Kwestia
zamiast tego umieścić uruchomiony proces z powrotem na pierwszym planie.
EDYCJA : Więcej szczegółów w tej odpowiedzi odkryłem później.
źródło
Użyj,
(exec PROGRAM &> /dev/null & )
aby zezwolić na przejęcie PID podpowłokiPROGRAM
. Podejście to przetestowałem wiele razy w kilku różnych programach. Zamknięcie oryginalnego terminalu nie ma wpływu na nowo powstały programMałe demo:
źródło
(exec firefox)
zawiesza terminal, dopóki nie opuszczę Firefoksa ... a zamknięcie terminala ZATRZYMUJE powłokę i podpowłokęMogę polecić terminal Byobu. Możesz łatwo odłączyć proces, naciskając klawisz F6.
źródło
Chociaż powyżej są dobre odpowiedzi, chciałbym dać moje 2 centy za to, jak używam MATLAB w tle.
-b
Tag 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
źródło
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ą.
źródło
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. (Zobaczkstart.cpp
kod źródłowy w celach informacyjnych . Jak widzisz stamtąd używaKProcess::startDetached
,KProcess
pochodziQProcess
istartDetached
rozpoczyna nowy proces oraz odłącza się od niego).Podobne jest również
kde-open
lubxdg-open
lubgnome-open
.źródło