Wie ändere ich die Ausgabeverleitung eines laufenden Prozesses?

11

Ich weiß, wie man Ausgaben umleitet und wie man sie in Bash unterdrückt . Nun nehme ich vergessen, versehentlich die Ausgabeumleitung Teil an den Befehl an (zB 2>&1oder > /tmp/mystdout) und mein Hintergrundprozess bereits eine Zeit lang läuft, kann ich noch ändern, wo stdoutund stderrwerden geschrieben? Ich möchte die Anwendung wirklich nicht beenden und neu starten.

Um genauer zu sein, wie Gilles in seinem Kommentar gefragt hat , möchte ich in diesen Szenarien speziell darauf eingehen:

  • falsche Ausgabedatei
  • vergessen zu umleiten stderrzustdout

oder eine Kombination von beiden

ZB Ich habe Apache laufen und ich kann sehen , die Datei - Deskriptoren:

/proc/8019/fd/0 -> /dev/null
/proc/8019/fd/1 -> /dev/null
/proc/8019/fd/2 -> /var/log/apache2/error.log
gertvdijk
quelle
Zu einem anderen Terminal wechseln? Oder zu einer Datei? Wenn Sie mit dem Anhängen an das aktuelle Terminal oder einer neuen Bildschirmsitzung zufrieden sind, lesen Sie Wie kann ich einen laufenden Prozess ablehnen und ihn einer neuen Bildschirmshell zuordnen?
Gilles 'SO - hör auf böse zu sein'

Antworten:

8

Sie können dies mit reredirect ( https://github.com/jerome-pouiller/reredirect/ ) tun .

reredirect -m /dev/null <PID>

Sie können die anfängliche Ausgabe Ihres Prozesses später wiederherstellen, indem Sie Folgendes verwenden:

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

( <M>und <N>werden durch vorherigen Start von reredirect bereitgestellt).

reredirect READMEerklärt auch, wie man zu einem anderen Befehl umleitet oder nur stdout oder stderr umleitet.

Jérôme Pouiller
quelle
3

Das ist nicht möglich. Oder zumindest nicht einfach. Sie haben vielleicht etwas Glück, wenn Sie gdb an den Prozess anhängen und in gdb damit herumspielen, aber das kann genauso leicht zu Abstürzen führen wie zum Erfolg.

Dennis Kaarsemaker
quelle
1
Dafür gibt es heutzutage Werkzeuge .
Gilles 'SO - hör auf böse zu sein'
Fühlen Sie sich frei, sie zu teilen, ich werde die Antwort
positiv
Ähm, das habe ich schon getan .
Gilles 'SO - hör auf böse zu sein'
1
Nicht ganz. Bei allen im anderen Fehler verknüpften Tools handelt es sich um das Anhängen an eine andere Terminal- / Bildschirmsitzung. Es geht nicht darum, in eine andere Datei umzuleiten. Obwohl es wahrscheinlich nicht schwer ist, Reptyr zu patchen, um stattdessen zu einer Datei umzuleiten.
Dennis Kaarsemaker
Ich habe mich ein wenig mit der Quelle von Reptyr befasst und stimme dem "nicht einfachen" Teil der Antwort am meisten zu. Könnte einige Zeit später tiefer eintauchen.
Gertvdijk
2

Sie sollten reptyr verwenden , um einen anderen Prozess an Ihr neues aktuelles Terminal anzuhängen. Zum Beispiel: Installation und GNU verwenden screenDienstprogramm, und darin starten Sie den reptyrBefehl „Fetch“ der andere Prozess der Umleitungen (und Steueranschluss) und sie an den neuen Stromanschluss (der screenProzess, wenn Sie ins Leben gerufen reptyraus screen). Der Vorteil einer screenSitzung besteht darin, dass die screenVerbindung zu dieser Sitzung leicht getrennt und wieder hergestellt werden kann (z. B. Schließen der lokalen Sitzung, Gehen nach Hause und erneutes Öffnen).

Olivier Dulac
quelle
Vielen Dank für Ihre Antwort, aber es hilft mir nicht bei meinem Fall, da ich nicht nach dem Entfernen / erneuten Anbringen des Terminals frage. Bitte lesen Sie meine Frage und das Beispiel noch einmal genau durch.
Gertvdijk
ah, in diesem Fall: Lesen Sie den Reptyr-Code und finden Sie heraus, wie Sie ihn ändern können, um nur stdout oder stderr umzuleiten. Führen Sie es dann von einer anderen Shell aus, die den neu angehängten Stream dorthin umleitet, wo Sie ihn haben möchten. (oder besser unter Verwendung der Reptyrquelle die Umleitung direkt durchführen)
Olivier Dulac