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
gertvdijk
źródło
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.

Jérôme Pouiller
źródło
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.

Dennis Kaarsemaker
źródło
1
Istnieją na to obecnie narzędzia .
Gilles „SO- przestań być zły”
Podziel się nimi, głosuję za odpowiedzią :)
Dennis Kaarsemaker
Um, już to zrobiłem .
Gilles „SO- przestań być zły”
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).

Olivier Dulac
źródło
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