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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2003
    Messages
    111
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 111
    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 confirmé
    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
    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 confirmé
    Inscrit en
    Décembre 2003
    Messages
    111
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 111
    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
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 853
    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 853
    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 confirmé
    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
    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 confirmé
    Inscrit en
    Décembre 2003
    Messages
    111
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 111
    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
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 853
    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 853
    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]

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