In der Shell können Sie eine Umleitung >
<
usw. durchführen, aber wie wäre es, nachdem ein Programm gestartet wurde?
So kam ich zu dieser Frage: Ein Programm, das im Hintergrund meines Terminals ausgeführt wird, gibt immer wieder nervigen Text aus. Es ist ein wichtiger Prozess, also muss ich eine andere Shell öffnen, um den Text zu vermeiden. Ich möchte in der Lage sein >/dev/null
oder eine andere Umleitung, damit ich weiterhin in derselben Shell arbeiten kann.
Antworten:
Wenn Sie Ihr tty nicht schließen und wieder öffnen (dh sich abmelden und wieder anmelden, wodurch möglicherweise auch einige Ihrer Hintergrundprozesse beendet werden), haben Sie nur noch eine Auswahl:
z.B:
Sie können auch berücksichtigen:
screen
; Der Bildschirm bietet mehrere virtuelle TTYs, zwischen denen Sie wechseln können, ohne neue SSH / Telnet / etc-Sitzungen öffnen zu müssennohup
; Auf diese Weise können Sie Ihre Sitzung schließen und erneut öffnen, ohne dabei Hintergrundprozesse zu verlieren.quelle
open("/path/to/new/stdout",O_WRONLY)
. O_WRONLY wird jedoch wahrscheinlich nicht verfügbar sein; Sein Wert ist1
unter Linux / glibc.1025
aktiviertO_APPEND
zusätzlich zuO_WRONLY
, was sehr praktisch ist , wenn Sie sowohl stderr und stdout in die gleiche Datei umleiten.Das wird es tun:
Es ist nicht so sauber (zeigt Zeilen wie :)
write(#,<text you want to see>)
, aber es funktioniert!Möglicherweise gefällt Ihnen auch die Tatsache nicht, dass Argumente abgekürzt werden. Um dies zu steuern, verwenden Sie den
-s
Parameter, der die maximale Länge der angezeigten Zeichenfolgen festlegt.Es fängt alle Streams ab, also möchten Sie das vielleicht irgendwie filtern:
zeigt nur Deskriptor 1-Aufrufe an.
2>&1
ist es, STDERR nach STDOUT umzuleiten, dastrace
standardmäßig in STDERR geschrieben wird.quelle
sudo
benötigt wird.Riffing von Vladrs (und anderen) exzellenter Forschung:
Erstellen Sie die folgenden zwei Dateien im selben Verzeichnis, etwas in Ihrem Pfad, z. B. $ HOME / bin:
Schweigen.gdb, enthält (aus der Antwort von vladr):
und Stille, enthaltend:
Wenn Sie das nächste Mal vergessen, beispielsweise Firefox umzuleiten, wird Ihr Terminal mit den unvermeidlichen Meldungen "(Firefox-Bin: 5117): Gdk-WARNING **: XID-Kollision, Probleme voraus" überfüllt:
Sie können die Ausgabe von gdb auch nach / dev / null umleiten, wenn Sie sie nicht sehen möchten.
quelle
--batch-silent
die die Ausgabe unterdrückt und Sie nicht in die GDB-Konsole bringt, wenn etwas schief geht (z. B. fehlender Prozess). Übrigens,$!
bezieht sich auf den letzten Hintergrundjob, aber ich glaube nicht, dass er im Skript selbst verwendet werden kann. Ich benutze einen Alias:alias silencebg='silence $!'
Leiten Sie die Ausgabe eines laufenden Prozesses auf ein anderes Terminal, eine andere Datei oder einen anderen Bildschirm um:
Inside gdb :
Trennen Sie einen laufenden Prozess vom Bash- Terminal und halten Sie ihn am Leben:
Erläuterung:
20818 - nur ein Beispiel für das Ausführen des Prozesses pid
p - Druckergebnis des GDB-Befehls
close (1) - Schließen der Standardausgabe
/ dev / pts / 4 - Terminal zum Schreiben zum
Schließen (2) - Schließen der Fehlerausgabe
/ tmp / myerrlog - Datei zum Schließen Schreiben Sie an
q - Beenden Sie gdb
bg% 1 - Führen Sie gestoppten Job 1 im Hintergrund aus. Verwerfen Sie% 1 - Trennen Sie
Job 1 vom Terminal
quelle
stdin
(Dateideskriptor0
) geschlossen ist.p open("/tmp/myerrlog", 2)
?Keine direkte Antwort auf Ihre Frage, aber es ist eine Technik, die ich in den letzten Tagen als nützlich empfunden habe: Führen Sie den ersten Befehl mit 'screen' aus und trennen Sie ihn dann.
quelle
Dies ist ein Bash-Skript-Teil, der auf vorherigen Antworten basiert und die Protokolldatei während der Ausführung eines geöffneten Prozesses umleitet. Er wird als Postscript im
logrotate
Prozess verwendetquelle
https://www.isi.edu/~yuri/dupx/
quelle
Sie können reredirect verwenden ( https://github.com/jerome-pouiller/reredirect/ ).
Art
und Ausgaben (Standard und Fehler) werden in FILE geschrieben.
reredirect README erklärt auch, wie der ursprüngliche Prozessstatus wiederhergestellt, zu einem anderen Befehl umgeleitet oder nur stdout oder stderr umgeleitet werden.
reredirect
Stellen Sie außerdem ein Skript mit dem Namen bereitrelink
, mit dem Sie zum aktuellen Terminal umleiten können:(Reredirect scheint dieselben Funktionen zu haben wie Dupx, das in einer anderen Antwort beschrieben wurde, aber es hängt nicht von Gdb ab).
quelle