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!
command-line
background-process
lustro
źródło
źródło
Odpowiedzi:
Przed uruchomieniem polecenia możesz dołączyć
&
do wiersza polecenia, aby uruchomić w tle:Po uruchomieniu polecenia możesz nacisnąć, CtrlZaby je zawiesić, a następnie
bg
umieścić w tle:źródło
find ...
polecenie, a następnie uruchomić je w tle. W tym przypadku brakowało Ci-name
opcji.Jest to ulubiony ze wszystkich, ponieważ oprócz wysyłania procesu w tło nie musisz się martwić o zabrudzenie terminala przez tekst:
To nie tylko uruchamia proces w tle, ale także generuje dziennik (wywoływany
nohup.out
w 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,
disown
ale to raczej rozszerzenie innych odpowiedzi, a nie metoda sama w sobie:Te polecenia nie pozwalają łatwo odzyskać danych wyjściowych procesu, chyba że użyjesz hackish sposób, aby to zrobić.
źródło
nohup
w powłoce kontroli zadań jest głupie. Nowoczesne powłoki nie wysyłająHUP
do procesów w tle. Przekierowanie do unikalnej nazwy pliku to niewielka cena do zapłaty.command > file.log 2>&1 & disown
jest nieco dłuższy niż,nohup command &
ale myślę, że właśnie to sugerował @chicks.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.log
które możesz określić. Jeśli w ogóle nie chcesz przechowywać danych wyjściowych - możesz użyć/dev/null
zamiast rzeczywistego pliku.&
wykona polecenie w tle, abyś mógł kontynuować wprowadzanie poleceń podczas jego działania.2>&1
przekierowuje 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 to1234
, więc możesz zabić go później, jeśli chcesz zkill -9 1234
źródło
2>&1
jest bardzo ważne, ponieważ polecenie może się nie powieść i spróbować wypisać błąd w niektórych przypadkach!Spójrz na ekran lub tmux . Przykład z
tmux
: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.
źródło
(Dla kompletności - już odpowiedziałem :) Umieszczasz polecenie w tle, dodając
&
po poleceniu: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
jobs
lubjobs -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.źródło
long_command with arguments &> redirection &
aby przekierowaćstderr
zbytMożesz uruchomić program w tle, używając
&
. Na przykład, jeśli chceszyum install XyZ
na przykład uruchomić , możesz uruchomić:Plik
stdout
lub 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ęyum
do plikuyum.log
:Lub, jeśli chcesz dodać wynik do istniejącego pliku
log
:Błędy są drukowane do
stderr
i niestdout
, i mogą być przekierowane do pliku w ten sam sposób, ale przy użyciu2>
:Jeśli chcesz przekierować jedno
stderr
i drugiestdout
, możesz użyć&>
:źródło
Możesz uruchomić polecenie w tle, po prostu umieszczając
&
po nim znak.Na przykład:
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
źródło
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.
źródło