web-dev-qa-db-fra.com

Comment puis-je réveiller un processus d'état de veille via signal ou / proc?

Il y a de nombreuses années, j'ai eu un problème avec Linux où les processus se rendraient au hasard. À l'époque, je savais un tour avec le /proc Système de fichiers pour déclencher un réveil du processus. Je me souviens vaguement de pouvoir faire quelque chose comme "echo R" >/proc/pid/stat Mais cela ne semble pas être la bonne commande.

Il y a beaucoup de succès sur Internet pour "Comment réveiller un processus de sommeil?" Et tant de réponses sont "Oh, tu tue ça!" Je sais qu'il y a une autre façon, mais ma mémoire me manque maintenant.

Jusqu'à présent j'ai essayé:

kill -SIGCONT <pid>
echo "R" > /proc/<pid>/status
echo "R" > /proc/<pid>/stat
6
Peter Grace

Que voulez-vous dire par "sommeil"?

Si vous voulez dire l'état S (sommeil interruptible), cela signifie que le processus attend l'E/S. Le processus est actuellement engagé dans un appel du système de blocage. Vous ne pouvez pas forcer à "se réveiller" de manière générique - que ferait-il alors? Il se réveillera lorsque l'opération d'entrée ou de sortie qu'il souhaite apporter est possible (par exemple, lorsque les données sont disponibles pour lire, lorsqu'un canal d'écriture devient prêt, etc.).

Si vous voulez dire, Etat T (arrêté), cela signifie que le processus est actuellement en suspension. Vous pouvez le non fusionné en l'envoyant un signal de suite (Sigcont): kill -CONT PID.

Les processus ne sont pas "allés aléatoirement". Ils dorment quand ils n'ont rien à faire. Ils sont suspendus s'ils reçoivent un signal qui les arrête: SIGTSTP, SIGSTOP, SIGTTIN, SIGTTOU. Ces deux derniers signaux sont envoyés par l'interface de terminal dans le noyau lorsqu'un processus d'arrière-plan tente de lire à partir du terminal (resp. Écrire sur le terminal); Si vous n'en êtes pas au courant, vous pourriez penser que le processus s'arrête au hasard. Si c'est ce qui s'est passé, vous devez le mettre au premier plan; Run fg Dans la coque à partir de laquelle vous avez commencé l'emploi en arrière-plan, avec le bon argument pour indiquer le travail que le processus fait partie, par exemple. fg %3.

Les stat* Fichiers dans Linux /proc sont en lecture seule et je ne suis au courant d'un moment où ils étaient écrits. Je ne sais pas ce que vous pouviez espérer écrire là-bas. Les données signalées par ce fichier sont des données gérées au noyau et certaines d'entre elles peuvent être modifiées plus ou moins directement directement par le processus, mais ce n'est pas quelque chose que vous pouvez modifier de l'extérieur. Par exemple, vous ne pouvez pas faire de manière magique un processus runnable.

Cela dépend de la manière dont un processus gère un signal. S'il ne le gère pas, la manière dont le processus veut, l'action par défaut du signal aura lieu, certains signaux peuvent être piégés et certains ne peuvent pas être.

Je ne suis pas sûr, mais vous devriez examiner la différence entre le processus arrêté et le processus de sommeil, en ce qui concerne le manuel du signal:

  Cont   Default action is to continue the process if it is currently stopped.

Pour le processus de sommeil, il peut s'agir de la commande fg.

0
Ijaz Ahmad Khan