Ubuntu n'envoie pas SIGTERM à l'arrêt

21

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 haltle 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.

GKraft
la source
Comment arrêtez-vous?
terdon
1
Chromium et LibreOffice ne traitent pas SIGTERM de la façon dont vous souhaitez qu'il soit géré
Andrea Corbellini
2
Je ne suis pas sûr de comprendre ce que vous voulez dire. Voulez-vous dire qu'ils ne gèrent pas correctement SIGTERM? Peut-être pas, mais comme je l'ai écrit dans ma question, je travaille sur un programme qui gère SIGTERM mais ce code ne semble jamais être exécuté. SIGINT tout en appuyant sur ctrl + C fonctionne parfaitement. Je crois toujours qu'il y a un problème concernant la notification par Ubuntu des processus en cours d'exécution à l'arrêt.
GKraft
1
Peut-être lié à ce bogue: # 1448259 Systemd n'envoie pas SIGTERM en premier à l'arrêt ?
JonasCz
2
Il est ennuyeux de devoir fermer toutes les applications manuellement, et si vous en oubliez une minimisée? Cela ne sauvera pas votre travail. Et il existe de nombreux processus d'arrière-plan que vous ne pouvez pas contrôler facilement ou auxquels vous ne pensez pas. Ils n'auront pas la possibilité de se nettoyer après eux-mêmes ou de sauver tout ce qu'ils faisaient.
GKraft

Réponses:

3

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:

$ pkill firefox

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.

c0xc
la source
Je vois que le processus d'arrêt et la gestion du signal n'ont pas fonctionné exactement comme je le pensais. Maintenant, je comprends comment il est censé fonctionner et pourquoi cela n'a pas fonctionné comme je m'y attendais.
GKraft
0

Pour ce que ça vaut, il y a quelque temps, j'ai trouvé cette procédure sur le forum Manjaro:

close_apps () {
WIN_IDs=$(wmctrl -l | grep -vwE "Desktop$|xfce4-panel$" | cut -f1 -d' ')
for i in $WIN_IDs; do wmctrl -ic "$i"; done

# Keep checking and waiting until all windows are closed
while [ "$WIN_IDs" != "" ]; do
        sleep 0.1;
        WIN_IDs=$(wmctrl -l | grep -vwE "Desktop$|xfce4-panel$" | cut -f1 -d' ')
done

}

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.

SR
la source
Je n'aurai pas accès à mon ordinateur pendant quelques jours donc je ne peux pas l'essayer même s'il est corrigé. Doit-il vraiment être nécessaire d'utiliser un tel script? Je pense que Ubuntu Shoukd le gère tout seul.
GKraft
D'accord. Cela fonctionne parfaitement dans Xubuntu, cependant. Par exemple, l'arrêt attendra indéfiniment s'il existe un document non enregistré.
SR
0

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

SR
la source
Ils semblent prometteurs. Je vais probablement finir par utiliser un script similaire.
GKraft