Je commence à soupçonner qu'Ubuntu ne dit pas aux applications en cours d'exécution qu'il s'arrête pour les laisser s'arrêter correctement mais les oblige à quitter.
Si je laisse Chrome ouvert lors de l'arrêt, il indique qu'il ne s'est pas fermé correctement la dernière fois lorsque je l'ouvre à nouveau après le démarrage, LibreOffice ne me demande pas si je veux enregistrer mon document et je crée une application qui doit exécuter du code à la sortie mais n'est pas autorisé à le faire lorsque l'ordinateur est éteint.
Si je comprends bien, SIGTERM est d'abord envoyé à tous les processus pour leur permettre de quitter proprement et s'ils ne quittent pas, SIGKILL est envoyé pour les forcer à quitter. Il semble qu'Ubuntu n'envoie pas du tout SIGTERM ou ne donne pas suffisamment de temps aux applications avant d'envoyer SIGKILL.
Existe-t-il un moyen de résoudre ce problème?
J'utilise Ubuntu 16.04 mais le problème existait également dans 15.10. Je ne peux pas dire s'il était là avant depuis que j'ai commencé à utiliser Ubuntu alors que 15.10 était la dernière version.
Edit: j'utilise Unity et j'arrête mon ordinateur en appuyant sur la roue dentée dans le coin supérieur droit et en sélectionnant arrêt, bien que le problème soit le même si vous utilisez sudo halt
le terminal.
Edit: J'observe le même comportement lorsque je me déconnecte uniquement. Je suppose que le signal est censé être envoyé lors de la déconnexion et que le problème se pose donc lors de l'arrêt et de la déconnexion.
Réponses:
Malheureusement, cela ne fonctionne pas tout à fait de cette façon. Beaucoup de ces programmes qui ont réellement un gestionnaire de signaux, ne bloquent pas le signal pour afficher une boîte de dialogue de confirmation. La gestion du signal est souvent minime ou manquante.
Vous pouvez facilement l'essayer sans avoir à arrêter. Envoyez simplement SIGTERM à votre processus Firefox ou LibreOffice en cours d'exécution:
Normalement, Firefox peut vous demander si vous souhaitez vraiment le fermer. De plus, la fermeture prend généralement un certain temps, en particulier lorsqu'elle fonctionne depuis longtemps et utilise plus de 1 Go de RAM - il faut souvent une minute pour que le processus se termine après la fermeture de sa dernière fenêtre. Rien de tout cela ne se produit lorsque vous envoyez SIGTERM, le processus se termine instantanément.
Cependant, certains environnements de bureau ferment toutes les fenêtres ouvertes avant de s'arrêter. Contrairement à SIGTERM, la fermeture d'une fenêtre par programmation revient à cliquer sur le bouton X de cette fenêtre, ou Alt+ F4. C'est également ce que fait le script dans l'autre réponse - il utilise wmctrl pour fermer toutes les fenêtres ouvertes avec élégance.
Lorsqu'une fenêtre est fermée, le programme n'est pas pressé et il peut tout fermer dans cette fenêtre, par exemple ouvrir des onglets, et il peut également afficher une fenêtre de dialogue s'il y a du travail non enregistré. Une fois que toutes les fenêtres ouvertes d'une application ont été fermées, le processus se termine généralement peu de temps après.
Cela dépend donc de votre environnement de bureau (en supposant que vous utilisez votre environnement de bureau pour arrêter et non
sudo poweroff
). Par exemple, KDE devrait attendre la fermeture des fenêtres ouvertes avant de s'arrêter, contrairement à MATE.Conclusion: fermez toutes les fenêtres ouvertes manuellement avant de fermer. Ou utilisez un environnement de bureau qui attend la fermeture de toutes les fenêtres.
la source
Pour ce que ça vaut, il y a quelque temps, j'ai trouvé cette procédure sur le forum Manjaro:
}
Vous pouvez l'appeler dans un script de votre choix pour fermer toutes les applications ouvertes avant l'arrêt (ou le redémarrage).
Le seul problème étant, il a été créé pour Xfce donc, il a besoin des changements que Unity DE impose. Un peu d'aide de quelqu'un de plus compétent viendrait bien ici pour aider à résoudre le problème d'OP.
la source
En fait, une partie du script qui ferme toutes les fenêtres et ne dépend pas d'un DE particulier est disponible sur Ask. Les 2 e et 3 e réponses sont particulièrement utiles. Avec seulement quelques lignes de plus, et en créant un lanceur dans le panneau ou sur le bureau, vous pouvez obtenir l'arrêt gracieux qui fonctionne dans le DE que vous utilisez.
Comment fermer gracieusement toutes les fenêtres ouvertes
la source