Czy mogę przekierować dane wyjściowe do pliku dziennika i jednocześnie uruchomić proces w tle?
Innymi słowy, czy mogę zrobić coś takiego?
nohup java -jar myProgram.jar 2>&1 > output.log &
Czy to nie jest rozkaz prawny? Czy też muszę ręcznie przenieść go do tła, na przykład:
java -jar myProgram.jar 2>$1 > output.log
jobs
[CTRL-Z]
bg 1
bash
shell
shell-script
djangofan
źródło
źródło
2>$1
prawdopodobnie ma być2>&1
.Odpowiedzi:
Jednym z problemów z pierwszym poleceniem jest przekierowanie stderr do miejsca, w którym znajduje się stdout (jeśli zmieniłeś $ na a & zgodnie z sugestią w komentarzu), a następnie przekierowałeś stdout do jakiegoś pliku dziennika, ale to nie pociąga za sobą przekierowanego stderr . Musisz to zrobić w innej kolejności, najpierw wyślij stdout tam, gdzie chcesz, a następnie wyślij stderr na adres stdout pod adresem
a następnie możesz włączyć i włączyć, aby wysłać go w tło. Do zadań można uzyskać dostęp za pomocą
jobs
polecenia.jobs
pokaże bieżące zadania i numeruje je. Następnie możesz porozmawiać o zadaniach, używając%, a następnie liczbykill %1
lub więcej.Ponadto bez znaku & na końcu możesz zawiesić polecenie za Ctrlzpomocą
bg
polecenia, aby umieścić je w tle ifg
przenieść z powrotem na pierwszy plan. W połączeniu zjobs
poleceniem jest to potężne.aby wyjaśnić powyższą część dotyczącą kolejności pisania poleceń. Załóżmy, że stderr to adres 1002, stdout to adres 1001, a plik to 1008. Polecenie czyta od lewej do prawej, więc pierwszą rzeczą, którą widzi w twoim, jest
2>&1
przesunięcie stderr na adres 1001, a następnie sprawdzenie,> file
który ruch stdout do 1008, ale utrzymuje stderr na 1001. Nie wyciąga wszystkiego wskazującego na 1001 i nie przenosi go do 1008, ale po prostu odwołuje się do stdout i przenosi go do pliku.Odwrotnie, przesuwa stdout na 1008, a następnie przesuwa stderr do punktu, na który wskazuje stdout, 1008. W ten sposób oba mogą wskazywać na pojedynczy plik.
źródło
$!
&> file.out
do przekierowania zarówno stdin, jak i stdout do pliku wyjściowego, co ogranicza możliwość pomyłki przy wstawianiu2>&1
niewłaściwego miejsca w linii poleceń.Zatrzymywanie się
<Ctrl+Z>
i kontynuowanie w tlebg
jest równoważne wykonywaniu z&
na końcu polecenia.Tak więc, aby uruchomić w tle i przekierować wyjście:
Jeśli potrzebujesz również, aby to polecenie nie umarło po wyjściu z terminala, powinieneś użyć
nohup
źródło
&
bg
można go odłączyć od sesji, uruchamiającdisown
, co powoduje, że proces nie umiera po zamknięciu terminalu.Zauważ, że
&>
kieruje zarówno stdout, jak i stderr do output.logźródło
Zamiast używać nohup, możesz użyć ekranu. Możesz zobaczyć status programu w czasie rzeczywistym. możesz nawet zapisać wszystkie dane wyjściowe w pliku. Jest to przydatne, gdy uzyskujesz dostęp do serwera za pośrednictwem ssh, gdzie się wylogowujesz z powodu złego połączenia lub braku aktywności. Po zalogowaniu możesz kontynuować pracę od miejsca, w którym wyszedłeś. zapoznaj się z tym i tym, aby wiedzieć szczegółowo.
źródło
tee
Komenda jest dość powszechne też.nohup java -jar myProgram.jar | tee output.log &
źródło