J'ai développé un algorithme pour un problème assez difficile en mathématiques qui peut prendre plusieurs mois. Comme je n'ai que des ressources limitées, j'ai commencé ceci sur mon ordinateur portable Ubuntu 12.04 (x86). Maintenant, je veux installer des mises à jour et redémarrer l'ordinateur portable (le message "redémarrez s'il vous plaît" est simplement ennuyeux).
Existe-t-il un moyen de sauvegarder tout un processus, y compris la mémoire allouée, pour le poursuivre au-delà d'un redémarrage?
Voici quelques informations sur le processus dont vous pourriez avoir besoin. S'il vous plaît n'hésitez pas à demander des informations supplémentaires si nécessaire.
- J'ai appelé le processus dans un terminal avec la commande "
./binary > ./somefile &
" ou "time ./binary> ./somefile &", je ne m'en souviens pas vraiment. - Cela affiche des informations de débogage sur std :: cerr (pas très souvent).
- Il utilise actuellement environ 600,0 Ko et, même si cela va augmenter, il est peu probable que cela augmente rapidement.
- le processus s'exécute avec une priorité normale
- le noyau est 3.2.0-26-generic-pae, le cpu est un AMD, le système d'exploitation est Ubuntu 12.04 x86.
- il fonctionne depuis 9 jours et 14 heures (donc trop long pour l'annuler ;-))
Réponses:
La solution la meilleure / la plus simple consiste à modifier votre programme pour enregistrer l'état dans un fichier et à réutiliser ce fichier pour restaurer le processus.
Basé sur la page wikipedia sur les instantanés d'application, il existe plusieurs alternatives:
CONFIG_CHECKPOINT_RESTORE
activé.C'est déjà trop tard, mais une autre approche plus pratique consiste à démarrer votre processus dans une machine virtuelle dédiée, puis à suspendre et restaurer l'ensemble de la machine virtuelle. En fonction de votre hyperviseur, vous pouvez également déplacer la machine entre différents hôtes.
Pour l’avenir, réfléchissez à l’endroit où vous exécutez vos processus de longue durée, à la façon de les mettre en parallèle et à la façon de traiter les problèmes, par exemple des disques entiers, un processus est tué, etc.
la source
Une façon assez "peu coûteuse" de faire cela serait de faire le traitement dans une machine virtuelle (par exemple, avec VirtualBox). Avant de fermer l'ordinateur, suspendez la machine virtuelle et enregistrez l'état. Après le démarrage, restaurez la machine virtuelle et son état.
Cela a l’inconvénient d’exiger la suppression et la reprise du travail. Mais si le système fonctionne effectivement pendant plusieurs mois, une différence de neuf jours devient triviale (augmentation de 5% sur six mois).
Edit: Je viens de me rendre compte qu'Ulrich avait déjà mentionné cela dans le point 4 non numéroté de sa liste.
Je vous encourage tout de même à envisager cette option, d'autant plus qu'aucune de ces solutions ne semble être une solution solide. Chacun a une raison pour laquelle cela peut ne pas fonctionner.
Je suppose que la meilleure chose à faire serait d’essayer l’une de ces solutions et, si cela ne fonctionne pas, redémarrez le travail dans une machine virtuelle.
la source
Jetez un coup d'œil à l'outil CryoPID .
Depuis la page d'accueil: "CryoPID vous permet de capturer l'état d'un processus en cours d'exécution sous Linux et de l'enregistrer dans un fichier. Ce fichier peut ensuite être utilisé pour reprendre le processus ultérieurement, soit après un redémarrage, soit même sur un autre ordinateur."
la source
Si vous avez besoin de redémarrer votre programme, je vous encourage à passer du temps à ajouter des fonctionnalités à votre code qui pourraient vous faire gagner du temps.
Si le processus doit être exécuté pendant une longue période, le fait de pouvoir sauvegarder l’état complet du processus lorsque vous redémarrez la machine n’est peut-être pas extrêmement utile si votre processus se bloque pendant son exécution.
Je vous encourage à avoir la sortie de votre programme dans un fichier "checkpoint" de données. Ces données doivent être suffisantes pour que votre programme puisse reprendre à partir de l'état où il se trouvait lorsque le fichier de point de contrôle a été enregistré. Vous n'avez pas besoin de sauvegarder l'ensemble du processus, mais un instantané des variables pertinentes utilisées dans votre calcul, suffisant pour que votre calcul reprenne là où il s'était arrêté. Votre code devra également inclure un moyen de lire les données de ce fichier pour obtenir son état de départ.
Vous pouvez configurer votre code afin que, lorsque vous lui envoyez un signal, il enregistre l'un de ces fichiers de point de contrôle afin que vous puissiez enregistrer "l'état" de votre calcul à tout moment.
De plus, être capable de voir comment les données changent au fur et à mesure du calcul peut être intéressant en soi!
la source