Postfix ne se connecte plus à / var / log / mail après avoir été supprimé et recréé?


10

J'ai accidentellement supprimé le /var/log/mailfichier. Jusque-là, je pouvais le surveiller en utilisant des trucs postfix. Maintenant, il semble que Postfix n'envoie pas ses journaux à /var/log/mail, car le fichier n'est pas mis à jour avec de nouveaux messages de journal.

Réponses:


9

Lorsque vous supprimez le fichier mail.log, rsyslog (sur ubuntu) lâche la poignée du fichier. Pour le faire fonctionner de nouveau sur Ubuntu, veuillez donner:

sudo service rsyslog restart

Cela va non seulement créer un nouveau fichier mais aussi commencer à écrire des journaux.


1
Au lieu de dire ce que vous avez fait, rendez la réponse plus générale (de manière instructive) en nous expliquant pourquoi.
Julie Pelletier

4

Même après avoir créé un fichier vide

touch /var/log/mail

vous devez redémarrer le syslog

service syslog restart

puis c'est le gain de journalisation :)


4

Il s'agit d'un bogue dans syslog, mais illustre un problème courant lorsque l'on supprime un fichier alors qu'il est ouvert par un programme. Lorsque vous effectuez un "rm", vous supprimez une entrée de répertoire, mais vous ne supprimez PAS le fichier sous-jacent. Le système d'exploitation conserve un nombre de références au fichier et ne supprimera pas réellement les données du fichier sous-jacent jusqu'à ce que le nombre de références atteigne zéro. Dans le cas d'un fichier moyen, le nombre de références du fichier non ouvert est un (l'entrée de répertoire). Lorsque le fichier est ouvert, le nombre est incrémenté à deux. Si un deuxième programme ouvre le même fichier, le nombre sera incrémenté à trois. Si l'entrée de répertoire est maintenant supprimée, le nombre est décrémenté à deux - ce qui signifie que le fichier est anomyme (n'a pas de nom),

Lorsque vous supprimez / var / log / mail, l'enregistreur système a toujours le fichier ouvert pour l'écriture. Si vous créez un nouveau / var / log / mail, il pointera vers un fichier différent de celui que l'enregistreur système écrit actuellement. La seule façon de rendre tout cohérent est de redémarrer l'enregistreur système. Lorsque l'enregistreur système d'origine se termine, tous les fichiers qui lui sont associés sont fermés, y compris le journal de messagerie anonyme dont vous avez supprimé l'entrée de répertoire. Lorsque vous redémarrez l'enregistreur système, il rouvrira / var / log / mail lorsqu'il aura besoin d'écrire un message de journal et le gardera ensuite ouvert.

Ceci est également souvent découvert lorsqu'un programme en cours d'exécution remplit tout un disque avec des données de fichier; l'utilisateur supprime le très gros fichier, mais l'espace disque n'est pas libéré, car le fichier existe toujours et occupe de l'espace disque, mais l'entrée de répertoire a été supprimée. À la fin du programme (soit parce que l'utilisateur l'a tué, soit parce qu'il s'est arrêté lui-même), l'espace disque sera récupéré car le nombre de références sur le fichier sera passé à zéro.

Ce que l'enregistreur peut faire pour éviter cela, c'est d'abord écrire le message du journal, vérifier si l'entrée du répertoire du fichier journal existe, et si elle n'existe pas, fermer le fichier journal d'origine, en ouvrir un nouveau, puis réécrire le message - pour que le message ne soit pas perdu. Mais pour faire tout cela, il faudrait beaucoup plus de complexité que l'enregistreur système devrait avoir - pour chaque message qu'il écrit prendra un peu plus de temps à écrire en raison de la vérification supplémentaire du répertoire - qui réussira chaque fois que le fichier aura PAS été supprimé.

Pour mieux comprendre tout ce qui précède, la commande suivante est instructive, car elle décrit l'appel système qui effectue la suppression de l'entrée de répertoire et le décrément de référence: "man 3 unlink"


4

Ce n'est pas le problème sur CentOS 7. Quelqu'un a pensé que ce serait une bonne idée d'avoir les journaux de messagerie postfix pour passer par le journal. Si vous voulez voir les journaux de postfix:

journalctl -u postfix

(pour voir le journal entier)

journalctl -u postfix -f

(pour suivre le journal)

Vous pouvez également avoir besoin dans le fichier main.cf pour postfix

syslog_name = postfix

1
J'ai passé trois heures à essayer de réparer un système où la journalisation avait disparu. Si je n'ai pas trouvé ce message, j'aurais passé encore 3 heures. Mon journal avait 10000 lignes, donc cette commande m'a aussi beaucoup aidéjournalctl --vacuum-time=1d
Eugene van der Merwe

2

fwiw versions plus récentes du journal de postfix /var/log/mail.loget j'ai également dû exécuter sudo chmod a+w /var/log/mail*et service postfix restartrécupérer mes journaux de postfix après les avoir supprimés

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.