Jak zmienić przekierowanie wyjściowe uruchomionego procesu?


11

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>&1Lub > /tmp/mystdout), a mój proces w tle już działa przez jakiś czas, czy nadal mogę zmienić lokalizację stdouti stderrzapisywanie? 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ć stderrnastdout

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

Zmienić na inny terminal? Lub do pliku? Jeśli jesteś zadowolony z dołączenia do bieżącego terminala lub nowej sesji ekranu, zobacz Jak mogę odrzucić działający proces i powiązać go z nową powłoką ekranu?
Gilles „SO- przestań być zły”

Odpowiedzi:


8

Możesz to zrobić za pomocą reredirect ( https://github.com/jerome-pouiller/reredirect/ ).

reredirect -m /dev/null <PID>

Możesz przywrócić początkowe dane wyjściowe procesu później, używając czegoś takiego:

reredirect -N -O <M> -E <N> <PID>

( <M>i <N>są dostarczane przez poprzednie uruchomienie reredirect).

reredirect READMEwyjaśnia również, jak przekierować na inne polecenie lub przekierować tylko stdout lub stderr.


3

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.



Podziel się nimi, głosuję za odpowiedzią :)
Dennis Kaarsemaker


1
Nie do końca. Wszystkie narzędzia połączone w drugim błędzie dotyczą dołączania do innej sesji terminalu / ekranu. Nie chodzi o przekierowanie do innego pliku. Chociaż łatanie reptyr do przekierowania do pliku prawdopodobnie nie jest trudne.
Dennis Kaarsemaker

Zajrzałem trochę do źródła reptyr i najbardziej zgadzam się z „niełatwą” częścią odpowiedzi. Może po pewnym czasie zanurkuję głębiej.
gertvdijk

2

Powinieneś użyć reptyr, aby dołączyć inny proces do nowego bieżącego terminala. Na przykład: zainstaluj i użyj screennarzędzia GNU , a następnie uruchom w nim reptyrpolecenie „pobrania” przekierowań drugiego procesu (i kontrolującego terminal) i dołącz je do nowego bieżącego terminala ( screenproces, jeśli uruchomiłeś reptyrz screen). Zaletą robienia tego z screensesji 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).


Dziękuję za odpowiedź, ale nie pomaga mi to w mojej sprawie, ponieważ nie pytam o odłączanie / odłączanie terminala. Przeczytaj ponownie moje pytanie i konkretny przykład.
gertvdijk

ah, w takim przypadku: przeczytaj kod reptyr, dowiedz się, jak go zmodyfikować, aby przekierowywał tylko stdout lub stderr. Następnie uruchom go z innej powłoki, która przekierowuje nowo dołączony strumień do miejsca, w którym chcesz go zabrać? (lub, lepiej, korzystając ze źródła reptyr, wykonaj przekierowanie bezpośrednio)
Olivier Dulac
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.