Jak uruchomić polecenie w tle i nie uzyskać żadnego wyniku?

111

Napisałem dwa skrypty powłoki a.shi b.sh. W a.shi b.shmam nieskończoną pętlę for i wypisują pewne dane wyjściowe do terminala. Chcę napisać inny skrypt, który wywoła oba a.shi, b.shale chcę, aby użytkownik natychmiast odzyskał kontrolę nad terminalem, zamiast uruchamiać skrypt w nieskończoność i chcę ukryć dane wyjściowe w terminalu.

Behnam Safari
źródło

Odpowiedzi:

220

Użyj, nohupjeśli twoje zadanie w tle trwa długo lub po prostu używasz SecureCRT lub czegoś podobnego do logowania na serwerze.

Przekieruj stdout i stderr na, /dev/nullaby zignorować dane wyjściowe.

nohup /path/to/your/script.sh > /dev/null 2>&1 &
Jerzy
źródło
Wystarczy dodać, że czasami istnieją argumenty dla skryptów, to powyższe polecenie zwróci niejednoznaczne przekierowanie wyjścia .
sabertooth1990
Lepszym sposobem, który znalazłem, jest użycie nohup /path/to/your/script.sh parameter1 > & 1 &Jeśli ktoś zna lepszy sposób.
sabertooth1990
18
Nie jest to konieczne, /dev/null 2>&1jeśli używasz, nohupponieważ już automatycznie dodaje wszystkie strumienie STDOUT i STDERR do pliku nohup.out. Użyj tylko:nohup /path/to/your/command &
Leonardo
1
@ sabertooth1990 Twój wiersz poleceń jest uszkodzony:-bash: syntax error near unexpected token '&'
notes-jj
1
Jak możesz wtedy zabić utworzony proces?
Alexis_A
33

Przekieruj dane wyjściowe do pliku takiego jak ten:

./a.sh > somefile 2>&1 &

Spowoduje to przekierowanie zarówno stdout, jak i stderr do tego samego pliku. Jeśli chcesz przekierować stdout i stderr do dwóch różnych plików, użyj tego:

./a.sh > stdoutfile 2> stderrfile &

Możesz użyć /dev/nulljednego lub obu plików, jeśli nie obchodzi Cię standardowe wyjście i / lub stderr.

Zobacz stronę podręcznika bash, aby uzyskać szczegółowe informacje na temat przekierowań.

Adam Zalcman
źródło
23

Przepraszamy, to trochę za późno, ale znalazłem idealne rozwiązanie dla niektórych poleceń, w których nie chcesz żadnych standardowych ani błędów wyjściowych (kredyt tam, gdzie jest to należne: http://felixmilea.com/2014/12/running-bash-commands-background -prawidłowo / )

To przekierowuje wyjście do null i utrzymuje ekran w czystości:

command &>/dev/null &
DanteAlighieri
źródło
2
Uwaga: polecenie zostanie zakończone, gdy terminal zostanie zamknięty.
Banan
1
Dla każdego, kto patrzy na to w przyszłości, kto chce rozwiązania, które umożliwiłoby działanie poleceń po zakończeniu sesji, sugerowałbym screen lub tmux. Niezbędne jest przeprowadzenie „sesji w ramach sesji”, która trwa po zamknięciu pierwszej sesji. Następnie możesz ponownie połączyć się z trwającą sesją, jeśli ponownie się zalogujesz. Świetne do wykonywania kopii zapasowych rsync, na przykład w przypadku, gdy synchronizacja musi działać przez długi czas, a nie chcesz zostawiać sesji uruchomionej.
DanteAlighieri
13

Jeśli znajdują się w tym samym katalogu co skrypt, który zawiera:

./a.sh > /dev/null 2>&1 &
./b.sh > /dev/null 2>&1 &

Na &końcu jest to, co sprawia, że ​​skrypt działa w tle.

> /dev/null 2>&1Część nie jest konieczne - to przekierowuje stdout i stderr strumieni, dzięki czemu nie trzeba ich zobaczyć na terminalu, który może chcesz zrobić dla hałaśliwych skryptów z partii produkcji.

Michael Chinen
źródło
7

Uruchom w podpowłoce, aby usunąć powiadomienia i zamknąć STDOUT i STDERR:

(&>/dev/null script.sh &)
Tom Hale
źródło
Jest to jedyna odpowiedź, która również nie drukuje dzienników zadań w tle jako [1] + 54765 done <emacs>podziękowanie
alper
2

Jeśli chcesz uruchomić skrypt w Linuksie kickstart, musisz uruchomić jak poniżej.

sh /tmp/script.sh > /dev/null 2>&1 < /dev/null &
SARATH CHANDRAN
źródło
1
nohup sh -x runShellScripts.sh &
vaquar khan
źródło
Co ma -xzrobić?
Alper
0

Te przykłady działają dobrze:

nohup sh prog.sh proglog.log 2> & 1 &

Dla pętli możesz użyć w ten sposób:

dla i w {1..10}; do sh prog.sh; spać 1; gotowe prog.log 2> & 1 &

Działa w tle i nie wyświetla żadnych danych wyjściowych.

Ramin Ismayilli
źródło