stdout/stderr eines Hintergrundjobs von der Konsole in eine Protokolldatei umleiten?

stdout/stderr eines Hintergrundjobs von der Konsole in eine Protokolldatei umleiten?

Ich führe einfach einen Job aus (nehme an, foo.sh).

./foo.sh
[Press Ctrl-Z to stop]
bg  # enter background

Und es generiert eine Ausgabe an stdout und stderr. Gibt es eine Methode, um von stdout und stderr auf eine andere Datei umzuleiten, anstatt auf den aktuellen Bildschirm?

Antwort1

Offenbar habe ich Ihre Frage beim ersten Mal falsch gelesen, daher hier meine aktualisierte Antwort:

Nachdem Sie Ihr Programm in den Hintergrund geschickt haben, müssen Sie zunächst seine PID finden

pgrep foo.sh

Dann könnten Sie verwenden gdb, um sich an diesen Prozess anzuhängen

gdb -p <PID>

In gdbändern Sie dann, wohin dieses Programm schreibt

p dup2(open("/path/to/file",577, 420), 1)
p dup2(1, 2)

dann löst man sich vom Prozess und gibt aufgdb

detach
quit

Eine kleine Erklärung

  • 577ist äquivalent zuO_CREAT|O_WRONLY|O_TRUNC
  • 420ist äquivalent zuS_IRUSR|S_IWUSR|S_IRGRP|S_IROTH
  • Der Aufruf openöffnet also die Datei und kürzt sie auf 0 Bytes, wenn sie existiert, oder erstellt eine neue mit den richtigen Dateiberechtigungen, wenn sie nicht existiert
  • Der erste Aufruf von dup2dupliziert den Dateideskriptor, der vom Aufruf von zurückgegeben wurde open( 1das ist stdout).
  • Der zweite Aufruf von dup2dupliziert den Dateideskriptor 1auf 2(das ist stderr).

verwandte Informationen