2012-09-06 3 views
1

Je suis en train de tester certaines fonctionnalités pour surveiller les processus et j'ai besoin d'émuler un vidage de mémoire avec un "délai" déterminé (par exemple, je dois faire un processus de "vidage du noyau" pendant 30 secondes). J'ai remarqué que le processus de vidage d'un noyau est en sommeil ininterrompu, donc il ne peut pas être tué avec SIGKILL, mais lorsque j'essaie d'émuler ce comportement en utilisant des commandes de tuyau qui reçoivent coredump, je peux facilement tuer un tel processus. Donc, y a-t-il un moyen de faire du processus pour entrer en sommeil sans interruption (avec un tel statut dans ps) et de le faire ignorer le SIGKILL?Comment mettre un processus en "sommeil ininterrompu"?

Répondre

1

Pour mettre un processus en mode de veille interruptible, vous devrez entrer le code du noyau. En utilisant la fonctionnalité wake_up_interruptible et les verrous d'essorage, vous serez en mesure d'atteindre cet état.

-3

Il n'y a aucun moyen de bloquer SIGKILL. C'est le but. L'approche du gros marteau pour se débarrasser d'un processus. La seule façon dont SIGKILL peut bloquer est si le processus est verrouillé dans le noyau.

+0

Mais pendant le processus de dumping, le processus de noyau est immunisé contre SIGKILL. –

+0

D'où ... bloqué dans le noyau. –

+0

Si vous les avez bloqués avec STAT == D, au moins sur nos systèmes (centos6.4) vous ne pouvez pas les tuer, vous devez résoudre le problème sous-jacent. – nhed

0

Une manière fiable (si compliquée) de le faire est de monter un répertoire NFS de manière matérielle, puis d'arrêter le serveur NFS.

3

Le moyen le plus approprié est d'utiliser un groupe de congélation. Il met le processus à un sommeil ininterrompu en cas d'état de groupe de congélation.

# mkdir /sys/fs/cgroup/freezer 
# mount -t cgroup -ofreezer freezer /sys/fs/cgroup/freezer 
# mkdir /sys/fs/cgroup/freezer/frozen 
# echo FROZEN > /sys/fs/cgroup/freezer/frozen/freezer.state 
# echo `pidof you_process` > /sys/fs/cgroup/freezer/frozen/tasks 

Pour mettre de nouveau en sommeil interruptible, il suffit de changer l'état de groupe en THAWED.

+0

Cela a fonctionné pour moi, merci. Pour une raison quelconque, la sortie de 'ps aux' ne reflète l'état' D' qu'après avoir envoyé SIGTERM au processus. –

Questions connexes