it-swarm.com.de

So leiten Sie die Ausgabe eines bereits laufenden Prozesses um

Normalerweise würde ich gerne einen Befehl starten 

longcommand &;

Ich weiß, du kannst es umleiten, indem du so etwas machst

longcommand > /dev/null;

b. um die Ausgabe loszuwerden oder

longcommand 2>&1 > output.log

ausgabe erfassen.

Aber manchmal vergesse ich es und fragte mich, ob es einen Weg gibt, nach der Tatsache zu erfassen oder umzuleiten.

longcommand
ctrl-z
bg 2>&1 > /dev/null

oder so ähnlich, damit ich das Terminal weiterhin verwenden kann, ohne dass Nachrichten auf dem Terminal erscheinen.

121
Sheldon Ross

Siehe Ausgabe eines laufenden Prozesses umleiten.

Zuerst führe ich den Befehl cat > foo1 in einer Sitzung aus und teste, ob die Daten von stdin in die Datei kopiert werden. Dann leite ich die Ausgabe in einer anderen Sitzung um.

Zuerst finden Sie die PID des Prozesses:

$ ps aux | grep cat
rjc 6760 0.0 0.0 1580 376 pts/5 S+ 15:31 0:00 cat

Überprüfen Sie nun die geöffneten Datei-Handles:

$ ls -l /proc/6760/fd
total 3
lrwx—— 1 rjc rjc 64 Feb 27 15:32 0 -> /dev/pts/5
l-wx—— 1 rjc rjc 64 Feb 27 15:32 1 -> /tmp/foo1
lrwx—— 1 rjc rjc 64 Feb 27 15:32 2 -> /dev/pts/5

Führen Sie jetzt GDB aus:

$ gdb -p 6760 /bin/cat
GNU gdb 6.4.90-debian

[license stuff snipped]

Attaching to program: /bin/cat, process 6760

[snip other stuff that's not interesting now]

(gdb) p close(1)
$1 = 0
(gdb) p creat("/tmp/foo3", 0600)
$2 = 1
(gdb) q
The program is running. Quit anyway (and detach it)? (y or n) y
Detaching from program: /bin/cat, process 6760

Der Befehl p in GDB gibt den Wert eines Ausdrucks aus. Ein Ausdruck kann eine aufzurufende Funktion sein, er kann ein Systemaufruf sein. Also führe ich einen close()-Systemaufruf aus und übergeben den Dateihandle 1, dann führe ich einen creat()-Systemaufruf aus eine neue Datei öffnen Das Ergebnis von creat() war 1, was bedeutet, dass das vorherige Dateihandle ersetzt wurde. Wenn ich dieselbe Datei für stdout und stderr verwenden wollte oder ein Dateihandle durch eine andere Nummer ersetzen wollte, müsste ich den dup2()-Systemaufruf aufrufen, um dieses Ergebnis zu erzielen.

Für dieses Beispiel habe ich creat() anstelle von open() gewählt, da weniger Parameter vorhanden sind. Die C-Makros für die Flags können von GDB nicht verwendet werden (es werden keine C-Header verwendet). Daher müsste ich die Header-Dateien lesen, um dies herauszufinden. Das ist zwar nicht so schwer, macht aber mehr Zeit. Beachten Sie, dass 0600 die Oktalberechtigung für den Besitzer mit Lese-/Schreibzugriff und die Gruppe und andere Benutzer ohne Zugriff ist. Es würde auch funktionieren, 0 für diesen Parameter zu verwenden und chmod später für die Datei auszuführen.

Danach überprüfe ich das Ergebnis:

ls -l /proc/6760/fd/
total 3
lrwx—— 1 rjc rjc 64 2008-02-27 15:32 0 -> /dev/pts/5
l-wx—— 1 rjc rjc 64 2008-02-27 15:32 1 -> /tmp/foo3 <====
lrwx—— 1 rjc rjc 64 2008-02-27 15:32 2 -> /dev/pts/5

Wenn Sie weitere Daten in cat eingeben, wird die Datei /tmp/foo3 angehängt.

Wenn Sie die ursprüngliche Sitzung schließen möchten, müssen Sie alle Dateikennungen dafür schließen. Öffnen Sie ein neues Gerät, das die steuernde Instanz sein kann, und rufen Sie dann setsid() auf.

111
user37875

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

Art

reredirect -m FILE PID

und Ausgänge (Standard und Fehler) werden in DATEI geschrieben.

in reredirect README wird auch erläutert, wie der ursprüngliche Status des Prozesses wiederhergestellt wird, wie auf einen anderen Befehl umgeleitet wird oder nur stdout oder stderr umgeleitet wird.

(Reredirect scheint die gleichen Eigenschaften zu haben wie Dupx, das in einer anderen Antwort beschrieben wurde, hängt aber nicht von Gdb ab).

15
Jezz
13
blah

Bildschirm

Wenn der Prozess in einer Bildschirmsitzung ausgeführt wird, können Sie den Befehl log des Bildschirms verwenden, um die Ausgabe dieses Fensters in einer Datei zu protokollieren:

Wechseln Sie zum Skriptfenster, C-aH protokollieren.
Jetzt kannst du :

$ tail -f screenlog.2 | grep whatever

Von der man-Seite des Bildschirms:

log [ein | aus]

Startet/stoppt das Schreiben der Ausgabe des aktuellen Fensters in eine Datei "screenlog.n" im Standardverzeichnis des Fensters, wobei n die Nummer des aktuellen Fensters ist. Dieser Dateiname kann mit dem Befehl 'logfile' geändert werden. Wenn kein Parameter angegeben wird, wird der Protokollierungsstatus umgeschaltet. Das Sitzungsprotokoll wird an den vorherigen Inhalt der Datei angehängt, sofern diese bereits vorhanden ist. Der aktuelle Inhalt und der Inhalt des Scrollback-Verlaufs sind nicht im Sitzungsprotokoll enthalten. Die Standardeinstellung ist "Aus".

Ich bin sicher, dass tmux auch etwas ähnliches hat.

7
lemonsqueeze

Ich habe einige Informationen im Internet gesammelt und ein Skript erstellt, das kein externes Werkzeug erfordert: Siehe meine Antwort hier . Ich hoffe es ist hilfreich.

0
Krzysztow