Wiem, jak przekierować dane wyjściowe i jak je tłumić w bash. Załóżmy teraz, że przypadkowo zapomniałem dołączyć część przekierowania wyjścia do polecenia (np. 2>&1
Lub > /tmp/mystdout
), a mój proces w tle już działa przez jakiś czas, czy nadal mogę zmienić lokalizację stdout
i stderr
zapisywanie? Naprawdę nie chciałbym zabijać i ponownie uruchamiać aplikacji.
Aby być bardziej szczegółowym, o co pytał Gilles w swoim komentarzu, chciałbym się tym zająć w następujących scenariuszach:
- zły plik wyjściowy
- zapomniałem przekierować
stderr
nastdout
lub kombinacja obu
Np. Mam uruchomiony Apache i widzę deskryptory plików:
/proc/8019/fd/0 -> /dev/null
/proc/8019/fd/1 -> /dev/null
/proc/8019/fd/2 -> /var/log/apache2/error.log
linux
bash
io-redirection
gertvdijk
źródło
źródło
Odpowiedzi:
Możesz to zrobić za pomocą reredirect ( https://github.com/jerome-pouiller/reredirect/ ).
Możesz przywrócić początkowe dane wyjściowe procesu później, używając czegoś takiego:
(
<M>
i<N>
są dostarczane przez poprzednie uruchomienie reredirect).reredirect
README
wyjaśnia również, jak przekierować na inne polecenie lub przekierować tylko stdout lub stderr.źródło
To nie jest możliwe. A przynajmniej niełatwe. Możesz mieć trochę szczęścia, dołączając gdb do procesu i majstrując przy nim w gdb, ale może to prowadzić do awarii równie łatwo jak sukcesu.
źródło
Powinieneś użyć reptyr, aby dołączyć inny proces do nowego bieżącego terminala. Na przykład: zainstaluj i użyj
screen
narzędzia GNU , a następnie uruchom w nimreptyr
polecenie „pobrania” przekierowań drugiego procesu (i kontrolującego terminal) i dołącz je do nowego bieżącego terminala (screen
proces, jeśli uruchomiłeśreptyr
zscreen
). Zaletą robienia tego zscreen
sesji jest to, że po przejściu na dółscreen
łatwo będzie się odłączyć i ponownie połączyć z nią (na przykład, zamykając sesję lokalną, wracając do domu i ponownie ją otwierając).źródło