119 votes

'Hibernate' un processus sous Linux

Est-il possible de "hiberner" un processus sous Linux? Tout comme "hibernate" dans un ordinateur portable, je voudrais écrire toute la mémoire utilisée par un processus sur un disque, libérant ainsi de la mémoire vive. Et puis plus tard, je peux «reprendre le processus», c’est-à-dire lire toutes les données dans la mémoire et les remettre dans la RAM pour pouvoir poursuivre mon processus?

Je vous remercie.

61voto

Tim Post Points 21270

J'ai utilisé pour maintenir CryoPID, qui est un programme qui fait exactement de quoi vous parlez. Il écrit le contenu d'un programme de l'espace d'adresse, VDSO, descripteur de fichier des références et des états dans un fichier qui peut ensuite être reconstruit. CryoPID a commencé quand il n'y avait pas utilisable crochets dans Linux lui-même et travaillé entièrement à partir de l'espace utilisateur (en fait, il n'est toujours travailler, selon votre distribution / kernel / paramètres de sécurité).

Des problèmes ont été (de fait) des sockets, dans l'attente de la RT signaux, de nombreux X11 questions, la glibc la mise en cache getpid() de la mise en œuvre, parmi beaucoup d'autres. La randomisation (surtout VDSO) s'est avéré être insurmontable pour les rares d'entre nous qui travaillent sur elle après Bernard s'éloigna d'elle. Cependant, il est amusant et est devenu le sujet de plusieurs maîtres de thèse.

Si vous êtes juste en contemplant un programme qui permet de sauvegarder son état d'exécution et re-démarrer directement dans cet état, de ses loin .. loin .. plus facile d'enregistrer les informations dans le programme lui-même, peut-être lors de l'entretien d'un signal.

41voto

dappiu Points 108

J'aimerais mettre une mise à jour de statut ici, à partir de 2014.

La accepté de répondre suggère CryoPID comme d'un outil pour effectuer de contrôle/de Restauration, mais j'ai trouvé le projet unmantained et impossible de compiler avec les noyaux récents. Maintenant, j'ai trouvé deux activement maintenue des projets visant à assurer l'application de la vérification de la fonctionnalité.

La première, celle que je suggère, car j'aurai plus de chance de le faire, est CRIU qui procède à des checkpoint/restauration principalement dans l'espace utilisateur, et nécessite l'option noyau CONFIG_CHECKPOINT_RESTORE permis de travail.

Point de contrôle/de Restauration Dans l'espace Utilisateur, ou CRIU (prononcé kree-oo, IPA: /krɪʊ/, russe: криу), est un outil logiciel pour le système d'exploitation Linux. À l'aide de cet outil, vous pouvez congeler une application en cours d'exécution (ou une partie) et de point de contrôle sur un disque dur comme une collection de fichiers. Vous pouvez alors utiliser les fichiers à restaurer et à exécuter l'application à partir du point où il a été congelé. La particularité de la CRIU projet est qu'il est principalement mis en œuvre dans l'espace utilisateur.

Ce dernier est DMTCP; citant leur page principale:

DMTCP (Distribué Multithread Checkpointing) est un outil de manière transparente point de contrôle de l'état de plusieurs demandes simultanées, y compris multi-thread et des applications distribuées. Il agit directement sur l'utilisateur d'un programme binaire exécutable, sans aucune des modules du noyau Linux ou autre modification du noyau.

Il ya aussi une belle page de Wikipédia sur l'argument: Application_checkpointing

24voto

caf Points 114951

Les réponses mentionnant ctrl-z sont réellement en train de parler d'arrêter le processus avec un signal, dans ce cas - SIGTSTP. Vous pouvez émettre un signal d'arrêt avec kill:

kill -STOP <pid>

Qui suspend l'exécution du processus. Il ne sera pas immédiatement libérer la mémoire utilisée par celle-ci, mais que la mémoire est nécessaire pour d'autres processus de la mémoire utilisée par le processus arrêté seront progressivement remplacées.

Lorsque vous voulez vous réveiller à nouveau, l'utilisation

kill -CONT <pid>

Le plus compliqué des solutions, comme CryoPID, sont vraiment nécessaire uniquement si vous souhaitez que le processus arrêté pour être en mesure de survivre à un système d'arrêt/redémarrage, il ne sonne pas comme vous avez besoin que.

16voto

Will Points 30630

La question est de rétablir le flux des fichiers et des prises de courant - que le programme a ouvert.

Lorsque toute votre OS en état d'hibernation, les fichiers locaux et peut évidemment être restauré. Connexions réseau n'est pas, mais alors le code qui accède à l'internet est généralement plus la vérification des erreurs et survit à la condition d'erreur (ou devrait).

Si vous n'avez par programme d'hibernation (sans le support de l'application), comment voulez-vous traiter les fichiers ouverts? Que faire si un autre processus accède à ces fichiers dans l'intervalle? etc?

La conservation de l'état lorsque le programme n'est pas chargé va être difficile.

Le simple fait de suspendre les fils et de le laisser être échangé sur le disque aurait le même effet?

Ou d'exécuter le programme dans une machine virtuelle et de laisser la machine virtuelle poignée de suspension.

12voto

Bref, la réponse est "oui, mais pas toujours de manière fiable". Découvrez CryoPID:

http://cryopid.berlios.de/

Ouvrir des fichiers sera en effet le problème le plus commun. CryoPID stipule explicitement:

Les fichiers ouverts et les décalages sont restaurés. Fichiers temporaires qui ont été délié et ne sont pas accessibles sur le système de fichiers sont toujours sauvegardées dans le image. Autres fichiers qui n'existent pas lors de la reprise ne sont pas encore rétabli. Le soutien pour l'enregistrement de contenu de fichier pour de telles situations est prévu.

Les mêmes questions seront également affecter les connexions TCP, si CryoPID prend en charge tcpcp pour la connexion de la reprise.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X