Ich führe jetzt seit einigen Tagen ein Skript aus. Ich habe stdout an umgeleitet $HOME/mylog
, aber stderr nicht umgeleitet, da ich dachte, dass nichts darauf sein würde. Plötzlich kamen Tausende von Zeilen auf stderr raus, also habe ich den Job abgebrochen. Gibt es eine Möglichkeit, $HOME/myerr
von nun an stderr umzuleiten , ohne das Skript neu starten zu müssen?
Ich habe Sudo-Zugriff auf die Box und es ist OS X.
Vielleicht etwas mit Dtools Trapping?
Ich kann die Arbeit, die das Skript bisher geleistet hat, nicht verlieren und neu starten. Gibt es eine Möglichkeit, „Dump die Objekte im Speicher“ auf der Festplatte, gefriert das Programm, zu bearbeiten , die Variablen (zB die Datei - Deskriptoren) und Lebenslauf mit dem neuen Kontext?
bash
io-redirection
stdout
Robottinosino
quelle
quelle
Antworten:
Ich halte es für möglich, wenn Sie den Prozess des zugehörigen Interpreters an gdb anhängen. Ich habe es mit diesem Perl-Einzeiler versucht
und es funktioniert aber leider nicht mit einem ähnlichen bash script.
Zunächst müssen Sie die PID des Prozesses ermitteln, dessen Ausgabe Sie erfassen möchten. Starten Sie dann
gdb
in einem anderen Terminal und führen Sie die folgenden gdb-Befehle ausdanach werden die gesamten Daten, in die geschrieben
stderr
wird, weitergeleitet/abs/olu/te/path/filename
, daattach PID
Hängt den Prozess an gdb an und stoppt ihncall close(2)
schließt denstderr
Filedescriptor des Prozesses (fürstdout
den Filedescriptor ist 1)call open(...)
öffnet eine neue Datei und verwendet die niedrigste nicht verwendete Ganzzahl für den neu erstellten Filedescriptor unddetach PID
setzt den Prozess fortZumindest auf meiner Maschine. Die ersten beiden Zeilen sind POSIX-kompatibel, die dritte jedoch nicht.
Das zweite und das dritte Argument
open
in der dritten Zeile sind in dokumentiertman 2 open
. In meinem Fall bedeutet 65, dassopen
die Datei erstellt und die Datei schreibgeschützt geöffnet werden soll, dhO_WRONLY | O_CREAT
(definiert infcntl.h
). Das dritte Argument weist open an, die Datei mit Lese- und Schreibberechtigung für den Benutzer zu erstellen, dhS_IWUSR | S_IRUSR
(definiert insys/stat.h
). Vielleicht müssen Sie die entsprechenden Werte an Ihrer Maschine selbst herausfinden.quelle
Dies ist eine grobe Antwort, und ich hoffe, dass es jemand anderem besser geht, aber wenn keine anderen Ideen auftauchen, fügen Sie gdb hinzu und zwingen Sie den Prozess, einige Systemaufrufe durchzuführen:
quelle
open()
FD 1 greift? Oder müssen Sie nurdup()
ein paar Mal anrufen ?p open("errfile", O_WRONLY)
wirklich auf Ihrer Maschine?p dup2(xxx, 2)
und dannp close(xxx)
woxxx
ist der Rückgabewert desopen
. Dies ist knifflig. Verwenden Sie diese Befehle besser nicht für einen lang andauernden Prozess, bis Sie sicher sind, dass es keine andere Wahl gibt./dev/null
als mein benutzte,errfile
also ich nicht brauchteO_CREAT
. UndO_WRONLY
ein Makro zu sein, ob es sich ausdehnt oder nicht , hängt davon ab , ob gdb den Prozess in einer Linie angehalten , wo Debugging - Symbole zur Verfügung stehen und das Makro definiert ist. Das Injizieren von Code in einen Prozess mit gdb ist gefährlich und niemand sollte diese Befehle einfach kopieren, ohne sie zu verstehen.