2013-03-22 16 views
7

Ich möchte den Kern eines laufenden Prozesses ausgeben, der laut /proc/<pid>/status derzeit auf Datenträgeraktivität blockiert. Tatsächlich ist es beschäftigt, Arbeiten an der GPU zu machen (sollte 4 Stunden Arbeit sein, aber es hat jetzt wesentlich länger gedauert). Ich würde gerne wissen, wie viel von der Arbeit des Prozesses getan wurde, also wäre es gut, in der Lage zu sein, den Speicher des Prozesses zu entleeren. Soweit ich weiß, bedeutet "Blockieren der Plattenaktivität" jedoch, dass es nicht möglich ist, den Prozess in irgendeiner Weise zu unterbrechen und einen Prozess zu entkernen, z. Verwenden von gdb erfordert unterbrechen und vorübergehend den Prozess zu stoppen, um über ptrace, oder?Kann ich einen Prozess, der Festplattenaktivität blockiert (vorzugsweise ohne ihn zu töten), einen Arbeitsspeicherabgleich durchführen?

Ich weiß, dass ich nur /proc/<pid>/{maps,mem} als root lesen konnte, die (möglicherweise inkonsistent) Speicherzustand zu erhalten, aber ich kenne keine Art und Weise halten, die User-Space CPU-Register Werte zu erhalten ist Prozess ... sie bleibt gleich, während der Prozess ist im Kernel, oder?

+0

Sie können den Ausdruck der Register jede halbe Stunde in Ihrem Quellcode hinzufügen .... – 0x90

+0

Natürlich wäre ich viel mehr zufrieden mit einer fertigen Lösung als über meinen eigenen Entkerner zu rollen. :( – thejh

+0

@ 0x90 richtig, aber ich würde gerne in der Lage sein, dies zu einem bereits laufenden Programm zu tun, weil ich ~ 9h der berechneten Daten durch force-rebooting nicht verlieren möchte oder für eine unbekannte Menge an Zeit warten muss diese Sache zu vervollständigen (wenn sie nicht irgendwo feststeckte), auch "jede halbe Stunde" würde es nicht tun - du müsstest es immer tun, bevor du eine Methode eingibst, die auf "Platte" blockieren könnte (oder wird) IO "für eine längere Zeit – thejh

Antwort

3

Sie können wahrscheinlich gcore auf Ihrem Programm ausführen. Es ist im Grunde genommen ein Wrapper um GDB, der sich anhängt, den gcore Befehl verwendet und sich wieder löst.

Dies könnte Ihr IO unterbrechen (als ob es ein Signal erhalten würde, was es wird), aber Ihr Programm kann es wahrscheinlich neu starten, wenn es richtig geschrieben wird (und dies kann in jedem Fall aufgrund der Standardbehandlung auftreten).

+0

Als eine Randnotiz, habe ich gerade dies mit einem einfachen Hallo Welt Typ Programm versucht. Ein Aufruf von' read() 'automatisch fortgesetzt. – Hasturkun

+0

Cool! Können Sie die Quelle in Ihrer Antwort? – Jess

+0

@Jessemon: Für die Hallo Welt? Es ist im Grunde 'char c; printf (" Hallo! \ N "); lesen (0, &c, 1);' Wie gesagt, nichts schlaues. – Hasturkun