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>&1
oder > /tmp/mystdout
) und mein Hintergrundprozess bereits eine Zeit lang läuft, kann ich noch ändern, wo stdout
und stderr
werden 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
stderr
zustdout
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
linux
bash
io-redirection
gertvdijk
quelle
quelle
Antworten:
Sie können dies mit reredirect ( https://github.com/jerome-pouiller/reredirect/ ) tun .
Sie können die anfängliche Ausgabe Ihres Prozesses später wiederherstellen, indem Sie Folgendes verwenden:
(
<M>
und<N>
werden durch vorherigen Start von reredirect bereitgestellt).reredirect
README
erklärt auch, wie man zu einem anderen Befehl umleitet oder nur stdout oder stderr umleitet.quelle
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.
quelle
Sie sollten reptyr verwenden , um einen anderen Prozess an Ihr neues aktuelles Terminal anzuhängen. Zum Beispiel: Installation und GNU verwenden
screen
Dienstprogramm, und darin starten Sie denreptyr
Befehl „Fetch“ der andere Prozess der Umleitungen (und Steueranschluss) und sie an den neuen Stromanschluss (derscreen
Prozess, wenn Sie ins Leben gerufenreptyr
ausscreen
). Der Vorteil einerscreen
Sitzung besteht darin, dass diescreen
Verbindung zu dieser Sitzung leicht getrennt und wieder hergestellt werden kann (z. B. Schließen der lokalen Sitzung, Gehen nach Hause und erneutes Öffnen).quelle