Recherche de processus zombie

Bonjour,

J’ai un processus qui se lance toutes les heures à exactement xh22 mn (à 1h22, 2h22, 3h22, etc…) et qui écrit quelque chose sur mon disque mais je n’arrive pas à trouver quel est le processus responsable et ce qu’il écrit.

J’ai vidé mon cron.hourly, désactivé le log du noyau ($ModLoad imklog dans /etc/rsyslog.conf) et activé le block_dump (echo 1 > /proc/sys/vm/block_dump) et surveillé les accès disques (watch “dmesg -c >> /tmp/mytemp/trace.txt”).

Je vois donc beaucoup de lignes à xh22 du genre:

[2013-05-29 01:22:03] jbd2/sda1-8(224): WRITE block 25459816 on sda1 (8 sectors)
[2013-05-29 01:22:03] jbd2/sda1-8(224): WRITE block 25459824 on sda1 (8 sectors)
[2013-05-29 01:22:03] jbd2/sda1-8(224): WRITE block 25459832 on sda1 (8 sectors)
[2013-05-29 01:22:03] jbd2/sda1-8(224): WRITE block 25459840 on sda1 (8 sectors)
[2013-05-29 01:22:03] jbd2/sda1-8(224): WRITE block 25459848 on sda1 (8 sectors)
[2013-05-29 01:22:03] jbd2/sda1-8(224): WRITE block 25459856 on sda1 (8 sectors)
[2013-05-29 01:22:03] jbd2/sda1-8(224): WRITE block 25459864 on sda1 (8 sectors)
[2013-05-29 01:22:05] jbd2/sda1-8(224): WRITE block 25459872 on sda1 (8 sectors)

Mais impossible de trouver à quoi correspond ces blocs:

debugfs /dev/sda1
debugfs 1.42.5 (29-Jul-254598162012)
debugfs:  icheck 25459816
Block	Inode number
25459816	<block not found>

Et bien entendu avec un simple “find / -cmin 60” (pour rechercher les fichiers ayant été modifiés pendant la dernière heure), je ne vois aucun fichier ayant bougé.

Quelqu’un aurait-il une petite idée pour m’aider à tuer ce processus zombie ?

Merci d’avance !

Ça n’est pas la journalisation tout simplement? Sinon il s’agit d’un fichier temporaire, il faudrait faire une commande qui fasse un debugfs immédiatement sur le numéro du bloc genre

watch -n 1 “dmesg -c | awk ‘{print "debugfs /dev/sda1 -R ickeck "$6}’ | sh”

J’ai monté la partition ext4 avec noatime donc je ne pense pas que ce soit la journalisation.
Merci pour le script, j’essaye ce soir !

J’ai hâte de trouver ce satané processus qui me créé des fichiers temporaires toutes les heures pour les effacer juste après !

Merci !

Hélas cela ne marche pas, j’ai toujours "block not found"
Je me demande comment c’est possible d’écrire sur un bloc que l’on arrive pas à trouver par la suite ???

Ça peut être un pipe où un fichier temporaire. Essaye avec iotop pour voir…

J’avais essayé avec iotop tout au début et cela ne me donnait que jbd2/sda1-8 sans aucune autre information.
C’est pourquoi j’ai essayé plutôt avec block_dump.

Tu aurais des exemples de “pipe” ? Je ne vois pas trop ce que c’est.

Je suis un peu à court d’idée pour arriver à comprendre ce qui se passe. Si tu avais d’autres moyens de recherche (autre que find, iotop et block_dump) je suis preneur !

Merci

Fkute, par pipe j’entends des tubes, lors de commandes genre «ls | grep toto» J’imagine que la sortie de ls peut être bufferisée (mais j’y crois moyen). Par contre j’avais beaucoup d’espoirs sur la sortie d’iotop.

Edit: Je n’avais pas compris que jbd2 était le nom du processus. C’est la bien la journalisation du système de fichiers (cf ici ou encore ), jbd2 est le gesstionnaire du journal de ext4

Oui c’est bien la journalisation, mais ce que je ne comprends pas c’est qu’il ne devrait même pas être lancé si aucun processus n’écrit sur le disque ?
Si je ne fais que lire et que ma partition est en noatime, je ne vois pas pourquoi il écrit quelque chose.

A moins que tu aurais une autre explication de la journalisation ?

Merci en tout cas de m’aider sur ce problème vraiment très difficile ! J’apprécie !

Ah oui hier soir j’ai désactivé pleins de services et tué gdm. Résultat: plus de jbd2/sda1-8 pendant la nuit !!
Il y a donc bien l’un des processus qui est responsable. Mais reste à trouver lequel.
Même avec une dichotomie en tuant/réactivant les processus, cela va me prendre du temps.

Et le plus embêtant c’est que je n’aurais pas trouvé le moyen “intelligent” pour identifier le processus responsable…

As tu monté les disques sans l’option noatime? Dans ce cas la simple ouverture d’un fichier entraine des écritures… Le cron-hourly pourrait faire ce genre de gag…

Je ne vois pas le rapport entre ce que tu décris et un “processus zombie”, qui répond à une définition précise.

Explication simple et plausible : ce bloc n’appartient pas (ou plus) à un inode (fichier ou répertoire). Cela peut être soit un bloc contenant des méta-données du système de fichiers comme le journal, soit un bloc qui a été libéré.

Non le cron-hourly est vide et j’ai monté le disque en noatime.

Je ne vois pas le rapport entre ce que tu décris et un “processus zombie”, qui répond à une définition précise.[/quote]

Zut je voulais dire un processus impossible à trouver.

[quote=“PascalHambourg”]

Explication simple et plausible : ce bloc n’appartient pas (ou plus) à un inode (fichier ou répertoire). Cela peut être soit un bloc contenant des méta-données du système de fichiers comme le journal, soit un bloc qui a été libéré.[/quote]

Ok mais si je n’écris rien sur mon disque, il ne devrait rien écrire dans le journal ? (je précise que la partition est bien montée avec noatime).

Et si le bloc est libéré à chaque fois, c’est vraiment un process bizarre qui écrit et libère systématiquement après toutes les heures. Du coup il est impossible pour moi de le trouver, je n’ai aucun moyen ?
(à part désactiver les processus les uns après les autres jusqu’à trouver le coupable…)

Merci !

Peut-être une idée. Il se peut que les tailles de bloc ne soient pas les mêmes. Les logs de block_dump semblent parler de secteurs, donc a priori une taille de 512 octets, alors que les systèmes de fichiers on des tailles de bloc plus importantes, généralement 4096 octets soit 8 secteurs, justement le nombre de secteurs écrits à chaque opération dans le log. Il faudrait donc peut-être diviser par 8 les numéros avant de les rechercher dans debugfs.

Ce sont toujours les mêmes blocs qui sont écrits toutes les heures ?

Je regarderais tout de même dans le syslog si il n’y a pas un processus qui s’écrit. Même si cron n’a rien à faire le processus est démarré et une ligne s’écrit dans le syslog, donc une écriture disque et une modification des journaux.

[quote=“PascalHambourg”]Peut-être une idée. Il se peut que les tailles de bloc ne soient pas les mêmes. Les logs de block_dump semblent parler de secteurs, donc a priori une taille de 512 octets, alors que les systèmes de fichiers on des tailles de bloc plus importantes, généralement 4096 octets soit 8 secteurs, justement le nombre de secteurs écrits à chaque opération dans le log. Il faudrait donc peut-être diviser par 8 les numéros avant de les rechercher dans debugfs.

Ce sont toujours les mêmes blocs qui sont écrits toutes les heures ?[/quote]

Wow, il fallait effectivement diviser par 8 pour avoir un bon résultat avec debugfs !
Je n’aurais jamais trouvé sans ton aide, chapeau bas.

Reste à relancer cette nuit avec cette bidouille pour voir les fichiers que je vais pêcher (ce sont certainement des fichiers temporaires, donc en lançant après coup je ne les verrai pas, il faut lancer le debugfs en live).
J’ai aussi désactivé exim et cron (je continue ma dichotomie).
Suite de la quête demain !

Merci encore !

Non j’ai bien cherché sur tout le disque avec “find -cmin” pour repérer les fichiers ayant bougés et je n’ai pas vu syslog dans la liste.
En regardant la date de dernière modif de syslog et le contenu, je vois aussi qu’il n’y a rien dedans.

J’ai relancé mon “watch” ce soir en désactivant cron et exim (je continue ma dichotomie en désactivant les processus).

Suite de la quête demain matin donc !

Merci encore !

Alors résultat des courses, aucune activité hier soir !
C’est donc entre exim et cron (je soupçonne cron).
Je relance cron et je continue mon watch pour voir si j’arrive à voir ce qui se passe…

La quête continue…

Bon j’ai essayé sur une heure et apparemment c’est bien cron qui semble écrire sur /tmp toutes les heures, même si le cron.hourly est vide:

[2013-06-01 11:17:07] jbd2/sda1-8(224): WRITE block 25583960 on sda1 (8 sectors)
[2013-06-01 11:17:07] jbd2/sda1-8(224): WRITE block 25583968 on sda1 (8 sectors)
[2013-06-01 11:17:07] jbd2/sda1-8(224): WRITE block 25583976 on sda1 (8 sectors)
[2013-06-01 11:17:07] jbd2/sda1-8(224): WRITE block 25583984 on sda1 (8 sectors)
[2013-06-01 11:17:07] jbd2/sda1-8(224): WRITE block 25583992 on sda1 (8 sectors)
[2013-06-01 11:17:07] jbd2/sda1-8(224): WRITE block 25584000 on sda1 (8 sectors)
[2013-06-01 11:17:07] jbd2/sda1-8(224): WRITE block 25584008 on sda1 (8 sectors)
[2013-06-01 11:17:07] jbd2/sda1-8(224): WRITE block 25584016 on sda1 (8 sectors)
[2013-06-01 11:17:37] flush-8:0(21026): WRITE block 0 on sda1 (8 sectors)
[2013-06-01 11:17:37] flush-8:0(21026): WRITE block 16 on sda1 (8 sectors)
[2013-06-01 11:17:37] flush-8:0(21026): WRITE block 46137472 on sda1 (8 sectors)
[2013-06-01 11:17:37] flush-8:0(21026): WRITE block 46137600 on sda1 (8 sectors)
[2013-06-01 11:17:37] flush-8:0(21026): WRITE block 46140592 on sda1 (8 sectors)
[2013-06-01 11:17:37] flush-8:0(21026): WRITE //tmp on sda1 (8 sectors)
[2013-06-01 12:17:07] jbd2/sda1-8(224): WRITE block 25584024 on sda1 (8 sectors)
[2013-06-01 12:17:07] jbd2/sda1-8(224): WRITE block 25584032 on sda1 (8 sectors)
[2013-06-01 12:17:07] jbd2/sda1-8(224): WRITE block 25584040 on sda1 (8 sectors)
[2013-06-01 12:17:07] jbd2/sda1-8(224): WRITE block 25584048 on sda1 (8 sectors)
[2013-06-01 12:17:07] jbd2/sda1-8(224): WRITE block 25584056 on sda1 (8 sectors)
[2013-06-01 12:17:07] jbd2/sda1-8(224): WRITE block 25584064 on sda1 (8 sectors)
[2013-06-01 12:17:07] jbd2/sda1-8(224): WRITE block 25584072 on sda1 (8 sectors)
[2013-06-01 12:17:09] jbd2/sda1-8(224): WRITE block 25584080 on sda1 (8 sectors)
[2013-06-01 12:17:42] flush-8:0(28169): WRITE //tmp on sda1 (8 sectors)
[2013-06-01 12:17:42] flush-8:0(28169): WRITE block 0 on sda1 (8 sectors)
[2013-06-01 12:17:42] flush-8:0(28169): WRITE block 16 on sda1 (8 sectors)
[2013-06-01 12:17:42] flush-8:0(28169): WRITE block 46137472 on sda1 (8 sectors)
[2013-06-01 12:17:42] flush-8:0(28169): WRITE block 46137600 on sda1 (8 sectors)
[2013-06-01 12:17:42] flush-8:0(28169): WRITE block 46140592 on sda1 (8 sectors)

Comme vous pouvez le constater, je n’arrive pas à traduire tous les blocs (j’ai fait un programme qui convertit à la volée les numéros de blocs, sauf s’il ne trouve pas de correspondance).
Mais à chaque écriture, j’ai /tmp qui apparaît. Je ne comprends pas pourquoi les autres blocs ne peuvent pas être traduit.

Bon je vais essayer de comprendre ce qu’écrit cron toutes les heures (et efface immédiatement).

Tu as aussi regardé dans /etc/crontab, /etc/cron.d/* et dans les crontabs de tous les utilisateurs ?

Ce sont peut-être des fichiers temporaires avec une très faible durée de vie.
Si cela te chargrine d’avoir ces écritures disque, une option à considérer est de mettre /tmp dans un tmpfs.