Für Katastrophen-Testszenarien in unserer Server-Umgebung suchen wir nach einer einfachen Möglichkeit, einen Prozess in den Zustand D (unterbrechungsfreier Ruhezustand) zu versetzen.
Irgendwelche einfachen Wege? Ein Beispiel-C-Beispielcode wäre ein Plus :)
Bearbeiten - Die erste Antwort ist halbkorrekt, da angezeigt wird, dass sich der Prozess im Status D befindet, er jedoch weiterhin Signale empfängt und abgebrochen werden kann
process
process-management
benchmark
er453r
quelle
quelle
Antworten:
Ich hatte das gleiche Problem und löste es, indem ich ein Kernelmodul erstellte, das im D-Zustand hängen bleibt.
Da ich keine Erfahrung mit Modulen habe, habe ich den Code aus diesem Turorial mit einigen Änderungen übernommen, die irgendwo anders gefunden wurden .
Das Ergebnis ist ein Gerät auf / dev / memory, das beim Lesen hängen bleibt, aber beim Schreiben darauf aufgeweckt werden kann (es benötigt zwei Schreibvorgänge, ich weiß nicht warum, aber es ist mir egal).
Um es einfach zu benutzen:
So entsperren Sie von einem anderen Terminal aus:
Makefile:
Code für memory.c:
quelle
Von https://blogs.oracle.com/ksplice/entry/disown_zombie_children_and_the
Ein Prozess wird in einen unterbrechungsfreien Ruhezustand versetzt,
(STAT D)
wenn er auf etwas warten muss (normalerweise E / A) und während des Wartens keine Signale verarbeiten soll. Das bedeutet, dass Sie es nichtkill
können, weil alles, was Sie töten, das Senden von Signalen ist. Dies kann in der Praxis vorkommen, wenn Sie Ihren NFS-Server vom Computer trennen, während andere Computer über offene Netzwerkverbindungen verfügen.Wir können unsere eigenen unterbrechungsfreien Prozesse von begrenzter Dauer erstellen, indem wir den
vfork
Systemaufruf nutzen.vfork
ist wiefork
, mit der Ausnahme, dass der Adressraum nicht vom Elternteil in das Kind kopiert wird, in Erwartung einer,exec
die nur die kopierten Daten wegwerfen würde. Günstig für uns, wenn Sievfork
als Eltern ununterbrochen (überwait_on_completion
) auf das Kind wartenexec
oderexit
:Wir sehen das Kind (
PID 1973, PPID 1972
) in einem ununterbrochenen Schlaf und das Elternteil (PID 1972, PPID 13291
- die Muschel) in einem ununterbrochenen Schlaf, während es 60 Sekunden auf das Kind wartet.Eine nette (schelmische?) Sache an diesem Skript ist, dass Prozesse in einem unterbrechungsfreien Schlaf zur durchschnittlichen Auslastung einer Maschine beitragen. Sie können dieses Skript also 100-mal ausführen, um einer Maschine vorübergehend einen um 100 erhöhten Lastdurchschnitt zu geben, wie von gemeldet
uptime
.quelle
kill
: /Im Grunde kann man nicht. Lesen Sie diesen Artikel mit dem Titel: TASK_KILLABLE: Neuer Prozessstatus unter Linux .
AuszugDiese SO Q & A mit dem Titel: Was ist ein unterbrechungsfreier Prozess? erklärt es auch.
Das habe ich in diesem sehr interessanten Buch mit dem Titel " Die Linux-Programmierschnittstelle: Ein Handbuch zur Linux- und UNIX-Systemprogrammierung" entdeckt .
quelle
TASK_KILLABLE
Status umschalten .