IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linux Discussion :

Intercepter le signal SIGKILL lors de l'arrêt de la machine


Sujet :

Linux

  1. #1
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    111
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 111
    Points : 55
    Points
    55
    Par défaut Intercepter le signal SIGKILL lors de l'arrêt de la machine
    Bonjour ou bonsoir,

    Voici le contexte du programme que je réalise :

    Lors de l'arrêt de la machine, deux signaux sont envoyés à chaque processus : SIGTERM puis SIGKILL.
    Le premier peut être intercepté mais pas le second.

    Existe-t-il donc une solution permettant de forcer l'interception du signal SIGKILL dans ce cas ?
    Ou alors y a-t-il une autre solution pour que le processus reprenne la main une dernière fois avant l'extinction de la machine ?

    Merci d'avance

  2. #2
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2010
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2010
    Messages : 58
    Points : 110
    Points
    110
    Par défaut
    Bonsoir

    à priori, la logique voudrait que non, vu que SYGKILL est censé provoquer la fin immédiate du processus... Cela dit, je n'en sais pas tellement plus À confirmer donc.

  3. #3
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    111
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 111
    Points : 55
    Points
    55
    Par défaut
    Effectivement, je m'y attendais un peu...

    Dans ce cas, est-ce qu'il n'y aurait pas un moyen de s'assurer que le processus a bien terminé ce qu'il était en train de faire avant de lui envoyer un SIGKILL (éteindre la machine) ?

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 679
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 679
    Points : 30 966
    Points
    30 966
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par guilhem91 Voir le message
    Bonsoir

    à priori, la logique voudrait que non, vu que SYGKILL est censé provoquer la fin immédiate du processus... Cela dit, je n'en sais pas tellement plus À confirmer donc.
    En fait, le signal SIGKILL n'est pas attrapé par le processus mais par l'ordonnanceur qui alloue le CPU aux différents processus. Lorsque le signal 9 arrive à destination du PID xxx, l'ordonnanceur sors tout simplement le pid XXX de sa liste. De là, le pid XXX n'a aucune possibilité de se prémunir contre le SIGKILL.


    Citation Envoyé par NooD Voir le message
    Effectivement, je m'y attendais un peu...

    Dans ce cas, est-ce qu'il n'y aurait pas un moyen de s'assurer que le processus a bien terminé ce qu'il était en train de faire avant de lui envoyer un SIGKILL (éteindre la machine) ?
    T'es en train de demander "est-ce que je peux m'assurer que le processus s'est bien terminé avant de l'arrêter". C'est idiot. S'il s'est terminé, t'as pas besoin de l'arrêter !!!

    Et si tu veux l'arrêter proprement, alors le SIGTERM est fait pour ça. Quand un processus reçoit un signal 15, il ferme proprement ses fichiers ouverts et se termine proprement. Si le programmeur a été assez niais pour empêcher cette action, de toute façon la question ne se pose pas. T'as besoin d'arrêter la machine, tu envoies direct un SIGKILL sans te préoccuper du processus. De toute façon, quand la machine sera arrêtée, ça m'étonnerait que ton processus tourne encore...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2010
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2010
    Messages : 58
    Points : 110
    Points
    110
    Par défaut
    @ Sve@r : c'est ce qui me semblait le plus logique en tout cas. Merci pour l'explication claire et précise, ça fait du bien pour la "culture générale"

  6. #6
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    111
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 111
    Points : 55
    Points
    55
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    T'es en train de demander "est-ce que je peux m'assurer que le processus s'est bien terminé avant de l'arrêter". C'est idiot. S'il s'est terminé, t'as pas besoin de l'arrêter !!!

    Et si tu veux l'arrêter proprement, alors le SIGTERM est fait pour ça. Quand un processus reçoit un signal 15, il ferme proprement ses fichiers ouverts et se termine proprement. Si le programmeur a été assez niais pour empêcher cette action, de toute façon la question ne se pose pas. T'as besoin d'arrêter la machine, tu envoies direct un SIGKILL sans te préoccuper du processus. De toute façon, quand la machine sera arrêtée, ça m'étonnerait que ton processus tourne encore...
    En fait l'idée est la suivante : lorsque le processus reçoit le signal SIGTERM, il commence à ranger ses affaires et à écrire ses données sur le disque.
    Le problème est le suivant : comment être sûr que le processus a bien écrit toutes les données qu'il voulait écrire sur le disque avant d'être tué (SIGKILL) et donc l'arrêt complet de la machine.

    Ma première idée était donc de récupérer ce fameux SIGKILL afin de vérifier que le boulot a bien été fait et achevé lors de la capture du SIGTERM mais cela n'est pas possible.

    Ma question est donc : comment être sûr que le processus s'est "terminé correctement" et non brutalement par un SIGKILL ?

    Pour parler d'un cas concret, j'ai lu un sujet qui parlait du même problème et où le processus était VMWare. En effet, le délais entre le SIGTERM et le SIGKILL est de 5 secondes alors que les machines virtuelles prenaient environ 10 minutes à s'arrêter. Dans ce cas on comprend bien bien le problème qui est d'empêcher l'arrêt de la machine tant que le processus VMWare n'a pas eu le temps d'arrêter les machines virtuelles.

    Mon objectif est-il plus clair ?

  7. #7
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 679
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 679
    Points : 30 966
    Points
    30 966
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par NooD Voir le message
    En fait l'idée est la suivante : lorsque le processus reçoit le signal SIGTERM, il commence à ranger ses affaires et à écrire ses données sur le disque.
    Le problème est le suivant : comment être sûr que le processus a bien écrit toutes les données qu'il voulait écrire sur le disque avant d'être tué (SIGKILL) et donc l'arrêt complet de la machine.

    Ma première idée était donc de récupérer ce fameux SIGKILL afin de vérifier que le boulot a bien été fait et achevé lors de la capture du SIGTERM mais cela n'est pas possible.

    Ma question est donc : comment être sûr que le processus s'est "terminé correctement" et non brutalement par un SIGKILL ?

    Pour parler d'un cas concret, j'ai lu un sujet qui parlait du même problème et où le processus était VMWare. En effet, le délais entre le SIGTERM et le SIGKILL est de 5 secondes alors que les machines virtuelles prenaient environ 10 minutes à s'arrêter. Dans ce cas on comprend bien bien le problème qui est d'empêcher l'arrêt de la machine tant que le processus VMWare n'a pas eu le temps d'arrêter les machines virtuelles.

    Mon objectif est-il plus clair ?
    Très clair. Mais tu peux pas... sauf si tu as programmé ledit processus pour envoyer une info quelconque quand il s'arrête et donc tu peux aller checker l'info. Mais comme tu parles d'un processus de façon générale... ben tu peux pas.

    Un ersatz de solution pourrait être de boucler sur ps |grep pid_du_processus. Tant que le pid apparait, tu refais un tour de boucle. Une fois qu'il n'apparait plus tu peux continuer ton arrêt machine.

    Et ton exemple vmware n'est pas le seul. J'ai moi aussi des processus qui ont besoin de temps pour s'arrêter. Et si j'arrête ma machine brutalement, ben ils ne s'arrêtent pas proprement et n'enregistrent pas leur config sur disque. Et quand je les relance, ben je suis obligé de les reparamétrer. Et donc quand j'arrête ma machine je veille bien à commencer par stopper ces programmes là et à attendre qu'ils soient arrêtés proprement avant de continuer.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  8. #8
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    C'est très simple : il a fini ce qu'il avait à faire si et seulement si il n'existe plus.

  9. #9
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    111
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 111
    Points : 55
    Points
    55
    Par défaut
    Bonjour,

    Citation Envoyé par Sve@r Voir le message
    Très clair. Mais tu peux pas... sauf si tu as programmé ledit processus pour envoyer une info quelconque quand il s'arrête et donc tu peux aller checker l'info. Mais comme tu parles d'un processus de façon générale... ben tu peux pas.

    Un ersatz de solution pourrait être de boucler sur ps |grep pid_du_processus. Tant que le pid apparait, tu refais un tour de boucle. Une fois qu'il n'apparait plus tu peux continuer ton arrêt machine.

    Et ton exemple vmware n'est pas le seul. J'ai moi aussi des processus qui ont besoin de temps pour s'arrêter. Et si j'arrête ma machine brutalement, ben ils ne s'arrêtent pas proprement et n'enregistrent pas leur config sur disque. Et quand je les relance, ben je suis obligé de les reparamétrer. Et donc quand j'arrête ma machine je veille bien à commencer par stopper ces programmes là et à attendre qu'ils soient arrêtés proprement avant de continuer.
    J'ai developpé le programme en question. Mais le fait qu'il envoie une information peut simplement me dire qu'il ne s'est pas terminé brutalement (et encore...) mais pas m'assurer que, à tous les coups, toutes les données ont été sauvegardées avant de quitter. L'idée d'interception du SIGKILL était de vérifier les données ET de "bloquer" temporairement l'arrêt si les données n'ont pas encore été écrites totalement.

    Citation Envoyé par matafan Voir le message
    C'est très simple : il a fini ce qu'il avait à faire si et seulement si il n'existe plus.
    Effectivement cela pourrait m'informer sur l'état du processus à l'arrêt. Bien que je ne vois pas très bien comment vérifier que le processus s'est terminé lors de l'arrêt de la machine. Il faudrait que le processus qui vérifie cela soit le dernier à s'arrêter.
    Cependant ça ne règle pas le problème énoncé plus haut, il faut que la machine patiente un peu lors de l'arrêt si le processus n'a pas fini son travail. Bien sûr il y aurait certainement un timeout pour être sûr de ne pas bloquer l'arrêt mais la valeur serait supérieure à 5 secondes (valeur par défaut actuelle entre le SIGTERM et le SIGKILL).

  10. #10
    Membre expérimenté

    Homme Profil pro
    Retraite
    Inscrit en
    Octobre 2005
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Retraite
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 478
    Points : 1 336
    Points
    1 336
    Billets dans le blog
    1
    Par défaut
    bonjour,

    suite à la question que tu posais, j'ai le même problème ?

    après avoir résolu :
    signal(SIGQUIT, signal_handler);
    signal(SIGHUP, signal_handler);
    signal(SIGTERM, signal_handler);
    signal(SIGCHLD, signal_handler);
    signal(SIGINT, signal_handler);
    signal(SIGSTOP, signal_handler);
    signal(SIGTSTP, signal_handler);


    j'ai fais les mêmes constats. le SIGKILL OUPS je travail avec xterm et ncurses (type ecran 5250 as400 ) et xterm avec les touches ctrl mouse click gauche tu peux kill ton travaille bon en teste génial mais en prod ouFFFF bref....

    j'ai pris le partis de me servir d'une base de données Postgresql 9.5 et LiteSQL 0.3.17

    en utilisant le COMMIT avec les frontière de transaction je retombe sur mes pieds .
    bien-sur cela complique la chose lorsqu’on a besoin d'un fichier init mais ce n'est pas insurmontable.

Discussions similaires

  1. Réponses: 3
    Dernier message: 20/08/2008, 14h22
  2. Service windows - Temps de latence lors de l'arrét
    Par Grosbenji dans le forum Windows
    Réponses: 1
    Dernier message: 09/07/2007, 14h10
  3. [Web-App][Servlet][Axis] Problème lors de l'arrêt de la web-app
    Par c.tranquille dans le forum Tomcat et TomEE
    Réponses: 1
    Dernier message: 02/12/2005, 09h49
  4. Traitements lors de l'arrêt de l'application ?
    Par Frank38 dans le forum Langage
    Réponses: 7
    Dernier message: 22/06/2005, 12h23
  5. Interception du signal SIGINT
    Par macleod dans le forum MFC
    Réponses: 2
    Dernier message: 01/07/2003, 18h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo