Pour les scénarios de test de catastrophe sur un environnement hors serveur, nous recherchons un moyen simple de bloquer un processus en état D (veille sans interruption).
Des moyens simples? Un exemple de code C serait un plus :)
Modifier - la première réponse est semi-correcte, car le processus est en état D, mais il reçoit toujours des signaux et peut être tué
Réponses:
J'ai eu le même problème et l'ai résolu en créant un module de noyau qui se coince dans l'état D.
Comme je n'ai aucune expérience dans les modules, j'ai pris le code de ce turorial avec quelques modifications trouvées quelque part esle .
Le résultat est un périphérique sur / dev / memory qui reste bloqué en lecture mais peut être réveillé en écrivant dessus (il a besoin de deux écritures, je ne sais pas pourquoi mais je m'en fiche).
Pour l'utiliser simplement:
Pour débloquer, depuis un autre terminal:
Makefile:
Code pour memory.c:
la source
Depuis https://blogs.oracle.com/ksplice/entry/disown_zombie_children_and_the
Un processus est mis en veille sans interruption
(STAT D)
lorsqu'il doit attendre quelque chose (généralement des E / S) et ne doit pas gérer les signaux en attendant. Cela signifie que vous ne pouvez pas lekill
faire, car tout ce que tuer fait, c'est lui envoyer des signaux. Cela peut se produire dans le monde réel si vous débranchez votre serveur NFS alors que d'autres machines y ont des connexions réseau ouvertes.Nous pouvons créer nos propres processus ininterrompus de durée limitée en tirant parti de l'
vfork
appel système.vfork
est similairefork
, sauf que l'espace d'adressage n'est pas copié du parent dans l'enfant, en prévision d'unexec
qui ne ferait que jeter les données copiées. Idéalement pour nous, lorsque vousvfork
le parent attend sans interruption (par le biais dewait_on_completion
) l'enfantexec
ouexit
:On voit l'enfant (
PID 1973, PPID 1972
) dans un sommeil interruptible et le parent (PID 1972, PPID 13291
- la coquille) dans un sommeil ininterrompu pendant qu'il attend 60 secondes sur l'enfant.Une chose intéressante (espiègle?) À propos de ce script est que les processus dans un sommeil ininterrompu contribuent à la moyenne de charge d'une machine. Vous pouvez donc exécuter ce script 100 fois pour donner temporairement à une machine une charge moyenne élevée de 100, comme indiqué par
uptime
.la source
kill
: /Fondamentalement, vous ne pouvez pas. Lisez cet article, intitulé: TASK_KILLABLE: Nouvel état de processus sous Linux .
extraitCe SO Q&A intitulé: Qu'est-ce qu'un processus ininterrompu? l'explique aussi.
J'ai découvert cela dans ce livre très intéressant intitulé: L'interface de programmation Linux: un manuel de programmation système Linux et UNIX .
la source
TASK_KILLABLE
état.