Uruchom polecenie, nie zmuszając mnie do czekania


145

W interfejsie CLI czasami wpisanie polecenia zajmuje trochę czasu, a czasem wiem, kiedy to się stanie. Jestem trochę zdezorientowany co do „tła” i takich w Linuksie.

Jaki jest najczęstszy (lub przyjazny dla użytkownika) sposób informowania CLI, że nie chcę czekać, natychmiast zwróć mi mój monit. I jeśli dałoby mi to pasek postępu lub po prostu zajęty spinner, byłoby świetnie!


3
Zobacz także Jak wysyłać aplikacje wiersza poleceń bezpośrednio w tle? jeśli już uruchomiłeś polecenie i chcesz wysłać je w tle.
Gilles,

Odpowiedzi:


153

Przed uruchomieniem polecenia możesz dołączyć &do wiersza polecenia, aby uruchomić w tle:

long-running-command &

Po uruchomieniu polecenia możesz nacisnąć, CtrlZaby je zawiesić, a następnie bgumieścić w tle:

long-running-command
[Ctrl+Z]
bg

Użyłem polecenia „znajdź ~ / a.java &”, ale nie poszedłem w tle? Próbowałem też cmd + z (dla komputerów Mac) .... to nie działa
Abhimanyu Aryan

1
@AbhimanyuAryan, może najpierw chcesz debugować swoje find ...polecenie, a następnie uruchomić je w tle. W tym przypadku brakowało Ci -nameopcji.
Alexis Wilke,

113

Jest to ulubiony ze wszystkich, ponieważ oprócz wysyłania procesu w tło nie musisz się martwić o zabrudzenie terminala przez tekst:

nohup command &

To nie tylko uruchamia proces w tle, ale także generuje dziennik (wywoływany nohup.outw bieżącym katalogu, jeśli nie jest to możliwe, w katalogu domowym), a jeśli zamkniesz / wylogujesz bieżącą powłokę, proces nie zostanie zabity przez uniemożliwienie procesowi potomnemu otrzymania nadrzędny sygnalizuje zabicie (tj. wylogowanie, przez SIGHUP do rodzica lub zamknięcie bieżącej powłoki).

Są inne tak zwane, disownale to raczej rozszerzenie innych odpowiedzi, a nie metoda sama w sobie:

command & # our program is in background
disown # now it detached itself of the shell, you can do whatever you want

Te polecenia nie pozwalają łatwo odzyskać danych wyjściowych procesu, chyba że użyjesz hackish sposób, aby to zrobić.


4
Sysadmin od '95. Nigdy nie słyszałem o wyparciu do dziś, dzięki! Nie działa jednak z każdą powłoką (sprawdzone bash, zsh, tcsh. Tcsh nie działało).
yoonix,

Używanie nohupw powłoce kontroli zadań jest głupie. Nowoczesne powłoki nie wysyłają HUPdo procesów w tle. Przekierowanie do unikalnej nazwy pliku to niewielka cena do zapłaty.
pisklęta

@ chicks przypadek użycia tutaj to zapobieganie zanieczyszczaniu terminala przez stderr i stdout plus plus, że automatycznie tworzy plik dziennika.
Braiam

1
command > file.log 2>&1 & disownjest nieco dłuższy niż, nohup command &ale myślę, że właśnie to sugerował @chicks.
joeytwiddle

31

To jest prawdopodobnie to, czego chcesz

my_command > output.log 2>&1 &

to uruchomi twoje polecenie, przekierowując zarówno stdout, jak i stderr do niektórych, output.logktóre możesz określić. Jeśli w ogóle nie chcesz przechowywać danych wyjściowych - możesz użyć /dev/nullzamiast rzeczywistego pliku.

&wykona polecenie w tle, abyś mógł kontynuować wprowadzanie poleceń podczas jego działania. 2>&1przekierowuje stderr na stdout, aby wszystkie dane wyjściowe zostały przechwycone.

ponadto, kiedy uruchomisz takie polecenie, powinieneś otrzymać potwierdzenie z jądra podobne do tego: [2] 1234 Oznacza to, że twój proces działa w tle, a jego identyfikator to 1234, więc możesz zabić go później, jeśli chcesz zkill -9 1234


2
dziękuję, 2>&1jest bardzo ważne, ponieważ polecenie może się nie powieść i spróbować wypisać błąd w niektórych przypadkach!
ericn

1
Ten zadziałał, gdy powyższe odpowiedzi nie podziękowały.
Domagoj

9

Spójrz na ekran lub tmux . Przykład z tmux:

$ tmux new -d 'longrunningcommand'

Podczas gdy inne odpowiedzi używające „i” do tła będą działać, musisz przekierować stdout (i stderr!). Bez tego, wyjście przejdzie bezpośrednio do twojej powłoki, mieszając się z dowolnym innym wyjściem, jakie możesz mieć.

Tło nie powiedzie się również, jeśli uruchomisz długie polecenie i wylogujesz się lub zostaniesz rozłączony. System zabije twoją pracę.

Jeśli nie znasz ani screena, ani tmuxa, w zasadzie pozwalają one całkowicie odłączyć się od powłoki. Zamiast tła programu, tworzysz całą powłokę w tle. Następnie możesz wrócić do niego później, nawet z innego komputera. Oba mają o wiele więcej funkcji, które mogą okazać się przydatne poza tym przypadkiem użycia.

Screen to stary wypróbowany i prawdziwy program; tmux jest znacznie młodszy, ale nauczył się z przeszłości ekranu.


Ta odpowiedź nie odpowiada rzeczywistej odpowiedzi i brzmi jak RTFM.
Lloeki,

5

(Dla kompletności - już odpowiedziałem :) Umieszczasz polecenie w tle, dodając &po poleceniu:

long_command with arguments > redirection &

Dodaję odpowiedź, aby odpowiedzieć na drugą część pytania:

Nie ma rzeczywistego odpowiednika pokrętła do pokazywania trwających poleceń w tle, ale możesz zobaczyć status poleceń w tle, wpisując jobslub jobs -l. Pokaże ci twoje polecenia w tle i czy są uruchomione, zatrzymane przez sygnał (np. Z ^Z), czy też czasami zatrzymane, ponieważ czekają na interaktywne wejście od ciebie.


long_command with arguments &> redirection &aby przekierować stderrzbyt
Ice-BLAZE

3

Możesz uruchomić program w tle, używając &. Na przykład, jeśli chcesz yum install XyZna przykład uruchomić , możesz uruchomić:

yum install XyZ &

Plik stdoutlub dane wyjściowe z programu można przekierować, używając >do zastąpienia pliku lub >>dołączenia do pliku. Na przykład, jeśli chcesz zalogować się yumdo pliku yum.log:

yum install XyZ > yum.log &

Lub, jeśli chcesz dodać wynik do istniejącego pliku log:

yum install XyZ >> log &

Błędy są drukowane do stderri nie stdout, i mogą być przekierowane do pliku w ten sam sposób, ale przy użyciu 2>:

yum install XyZ 2> errors
yum install XyZ 2>> errors

Jeśli chcesz przekierować jedno stderri drugie stdout, możesz użyć &>:

yum install XyZ &> output
yum install XyZ &>> output

2

Możesz uruchomić polecenie w tle, po prostu umieszczając &po nim znak.

Na przykład:

areallylong_command &

uruchomię to w tle.

Możesz dodatkowo przekierować stdout / stderr do odpowiednich plików, aby nie pojawiały się one na twoim terminalu, gdy coś robisz.

Zobacz to, aby uzyskać więcej informacji: http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-3.html


0

Spróbuj użyć polecenia „screen” przed rozpoczęciem długotrwałego zadania, a następnie po odłączeniu możesz ponownie podłączyć się do niego za pomocą „screen -r -d”, kiedy tylko zajdzie taka potrzeba. Uważam, że podczas korzystania z terminala przez ssh lub inne połączenia sieciowe mogą czasami zostać zerwane przez złe połączenie z serwerem. uruchomienie go na „ekranie” rozwiązuje ten problem.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.