Dlaczego widzę wynik procesów w tle?

31

Na przykład, kiedy piszę ping 8.8.8.8 &, dlaczego możemy zobaczyć, że działa proces ping? A kiedy piszę find / -name '*test*' &, widać to również na monitorze.

Dlaczego? Czy to nie jest tak naprawdę w tle?

Brak ogrodzenia
źródło

Odpowiedzi:

43

&Kieruje skorupę, aby uruchomić komendę w tle, to znaczy, że jest rozdwojony i uruchomić w osobnym sub-shell, w pracy, w sposób asynchroniczny.

Zauważ, że po umieszczeniu &wyjścia - zarówno standardowego, jak i standardowego - nadal będzie drukowane na ekranie . Jeśli nie chcesz wyświetlać żadnych danych wyjściowych na ekranie, przekieruj zarówno plik , jak stdouti stderrplik do:

myscript > ~/myscript.log 2>&1 &

Zwykle możesz odrzucić stderr, przekierowując go, /dev/nulljeśli nie martwisz się późniejszą analizą błędów.

Możesz także uruchamiać polecenia / skrypty w tym samym czasie, w osobnych podpowłokach. Na przykład;

./script1 & ./script2 & ./script3 & 

Zadanie w tle można przywrócić do wiersza poleceń, zanim zakończy się ono poleceniem:

fg <job-number>

job-numberMożna uzyskać uruchamiając

jobs
Ron
źródło
Dobra odpowiedź. Możesz dołączyć, że można go również użyć /dev/nulljako pliku do przekierowania wyjścia terminala, jeśli chce się go wyrzucić zamiast go gdzieś zapisać. I czy mam rację, że 2>&1przekierowuje stderrdo stdout? Może też chcesz to wyjaśnić ... Dzięki.
Bajt Dowódca
@ByteCommander Dzięki :) edytowane, mam nadzieję, że teraz jest jasne. Tak, masz rację, 2>&1przekierowuje stderrdo stdout.
Ron
3
Myślę, że warto wspomnieć, że stty tostopspowoduje to zawieszenie zadań w tle, jeśli spróbują napisać na terminalu.
kasperd
cmd_with_params> / dev / null 2> / dev / null &
tgkprog
Jedynym minusem tego jest to, że kolejność danych wyjściowych do stdout i stderr może zostać pomieszana w pliku dziennika.
matthieu
8

Podczas używania &proces działa w tle. Ale jego standardowym wyjściem jest nadal terminal.

W rzeczywistości, można uruchomić ping 8.8.8.8 &i find / -name '*test*' &w tym samym czasie (w wyniku mieszanej wyjściu), ale nie może działać ping 8.8.8.8i find / -name '*test*'jednocześnie na tej samej powłoki.

Jeśli nie chcesz nic widzieć, użyj czegoś takiego ping 8.8.8.8 &> /dev/null &.


Dodatkowo możesz chcieć dowiedzieć się o nohupi disown.

Andrea Corbellini
źródło
disownnie zapobiega wydrukowaniu danych wyjściowych na terminalu.
Ruslan
@ Ruslan: nie, ale usuwa zadanie z powłoki. Który może (ale nie musi) być czymś, czym OP może być zainteresowany.
Andrea Corbellini,