Czasami chcę rozpocząć proces i zapomnieć o nim. Jeśli uruchomię go z wiersza poleceń, tak:
redshift
Nie mogę zamknąć terminalu, bo to zabije proces. Czy mogę uruchomić polecenie w taki sposób, że mogę zamknąć terminal bez zabijania procesu?
Czasami chcę rozpocząć proces i zapomnieć o nim. Jeśli uruchomię go z wiersza poleceń, tak:
redshift
Nie mogę zamknąć terminalu, bo to zabije proces. Czy mogę uruchomić polecenie w taki sposób, że mogę zamknąć terminal bez zabijania procesu?
yourExecutable &
a wyniki wciąż pojawiają się na ekranie iCtrl+C
nie wydają się niczego zatrzymywać, po prostu ślepo wpiszdisown;
i naciśnij,Enter
nawet jeśli ekran przewija się z wyjściami i nie możesz zobaczyć, co piszesz. Proces zostanie odrzucony, a ty będziesz mógł zamknąć terminal bez śmierci procesu.Odpowiedzi:
Jedna z następujących 2 powinna działać:
lub
Zobacz poniższe, aby uzyskać więcej informacji na temat tego, jak to działa:
man nohup
help disown
Różnica między nohup, disown i & (koniecznie przeczytaj też komentarze)
źródło
redshift & disown
) pracował dla mnie na Ubuntu 10.10. Wygląda na to, że działa dobrze, umieszczając wszystko w jednym wierszu. Czy jest jakiś powód, dla którego nie powinienem tego robić?nohup redshift &
więc działa w tle). A umieszczenie drugiego w jednym wierszu jest w porządku, chociaż zwykle oddzielamy się od;
(redshift &; disown
);
i&
są separatorami komend i mają równe pierwszeństwo. Jedyną różnicą jest odpowiednio synchroniczne i asynchroniczne wykonanie. Nie ma potrzeby używania&;
zamiast preferencji&
(działa, ale jest nieco redundantne).redshift &!
natychmiast odrzuci przesunięcie ku czerwieni.Jeśli twój program już działa , możesz go zatrzymać
Ctrl-Z
, pociągnąć w tło za pomocą,bg
a następnie wdisown
następujący sposób:źródło
disown
nie odłącza stdout ani stderr. Jednaknohup
podobnie jak>/dev/null
(odłącz standardowe wyjście),2>/dev/null
(odłącz standardowy błąd). To (disown
) rozłącza kontrolę zadań.Dobra odpowiedź jest już opublikowana przez @StevenD, ale myślę, że może to nieco to wyjaśnić.
Powodem, dla którego proces zostaje zabity po zakończeniu terminala, jest to, że proces, który uruchamiasz, jest procesem potomnym terminala. Gdy zamkniesz terminal, zabije to również te procesy potomne. Możesz zobaczyć drzewo procesów
pstree
, na przykład podczas uruchamianiakate &
w Konsoli:Aby
kate
proces został odłączonykonsole
po zakończeniukonsole
, użyjnohup
polecenia:Po zamknięciu
konsole
,pstree
będzie wyglądać następująco:i
kate
przetrwa. :)Alternatywą jest użycie
screen
/tmux
/byobu
, które utrzyma działanie powłoki, niezależnie od terminala.źródło
Możesz uruchomić taki proces w terminalu
setsid process
Spowoduje to uruchomienie programu w nowej sesji. Jak wyjaśniono http://hanoo.org/index.php?article=run-program-in-new-session-linux
źródło
nohup.out
. 2) Nie pozostaje na liście zadań twojej powłoki, więc nie zaśmieca wynikówjobs
.Chociaż wszystkie sugestie działają dobrze, znalazłem moją alternatywą jest użycie
screen
programu, który konfiguruje wirtualny terminal na ekranie.Możesz rozważyć rozpoczęcie od . Screen może być zainstalowany na praktycznie wszystkich pochodnych Linux i Unix. Naciśnięcie + i (małe litery) rozpocznie drugą sesję. Umożliwiłoby to przełączanie się między początkową sesją, naciskając + i / lub nowszą sesją, naciskając + i . W jednym terminalu możesz mieć do dziesięciu sesji. Kiedyś zaczynałem sesję w pracy, wracałem do domu, ssh na mojej maszynie roboczej, a potem wywoływałem . Spowoduje to ponowne połączenie się z tą zdalną sesją.
screen -S session_name
CtrlACCtrlA0CtrlA1screen -d -R session_name
źródło
screen -d -m command
rozpocznie się na już odłączonym ekranie:~# screen -d -m top ~# screen -ls There is a screen on: 10803..Server-station (Detached) 1 Socket in /root/.screen. ~# screen -x
.... i jesteś w środku.Jedynym sposobem na wykonanie tego wszystkiego jest zamknięcie stdin i umieszczenie w tle polecenia:
Wtedy nie wyjdzie, gdy opuścisz powłokę. Przekierowanie standardowego wyjścia jest fajną opcjonalną rzeczą do zrobienia.
Wadą jest to, że nie można tego zrobić po fakcie.
źródło
Mam skrypt do:
Uruchom dowolne polecenia w tle
Powstrzymaj ich przed zabiciem za pomocą okna terminala
Pomiń ich wydajność
Obsługuje status wyjścia
Używam go głównie do
gedit
,evince
,inkscape
etc, że wszyscy mają mnóstwo irytujących wyjścia terminala. Jeśli polecenie zakończy się wcześniejTIMEOUT
, status wyjścia nohup jest zwracany zamiast zera.przykłady ...
źródło
Wolę:
(Nazwa aplikacji &)
na przykład:
linux@linux-desktop:~$ (chromium-browser &)
Pamiętaj, aby użyć nawiasu podczas wpisywania polecenia!
źródło
nohup
zapobiega wszelkim wynikom tty, a ja po prostu chciałem przekierować dane wyjściowe do pliku i zapobiegło to, więc jest to dla mnie lepsze rozwiązanie.Możesz ustawić proces (PID), aby nie odbierał sygnału HUP po wylogowaniu i zamknięciu sesji terminala. Użyj następującego polecenia:
źródło
Prawdopodobnie podobny do odpowiedzi oferowanej przez apolinsky , używam wariantu na
screen
. Polecenie waniliowe jest takieSesję można rozłączyć Ctrl ACtrl Di ponownie połączyć w prostym przypadku z
screen -r
. Mam to zawinięte w skrypt o nazwie,session
który żyje w mojejPATH
gotowości do wygodnego dostępu:Działa to tylko wtedy, gdy wiesz z góry, że chcesz odłączyć program. Nie zapewnia odłączenia już działającego programu.
źródło
Podobnie jak w przypadku innych odpowiedzi opublikowanych wcześniej, można przenieść działający proces, aby użyć retrospektywnie „ekranu” dzięki reptyr, a następnie zamknąć terminal. Kroki opisano w tym poście . Kroki, które należy podjąć, to:
źródło