J'ai écrit un script sur CentOS et maintenant j'essaie de l'exécuter sur Ubuntu et il se comporte de manière inattendue. Voici quelque chose comme le script, que j'exécute sous bash :
sudo tail -F /var/opt/my-application/log/my-application.log |
awk '
BEGIN {
ORS=" "
}
{ if ($8 ~ /MATCH-TEXT/) {
# do a whole bunch of stuff here
# like look in /proc and calculate CPU and interface stats
};
};
} '
Auparavant, lorsqu'une ligne avec MATCH-TEXT apparaissait dans le champ $8 de mon journal, tout le "faire un tas de trucs" (la viande du script) se produisait et je voyais la sortie. Mon application génère des lignes MATCH-TEXT environ une fois par seconde (parfois plus, parfois moins) et il en va de même pour la sortie de ce script.
Maintenant, cependant, lorsque je lance ce script, je n'obtiens aucune sortie pendant un long moment, puis j'obtiens peut-être 30 lignes de sortie d'un coup. Il semble que le script mette en file d'attente les lignes de journal qu'il reçoit, puis s'exécute plusieurs fois rapidement parce que les calculs sur le CPU et l'interface sont justes pour "depuis une minuscule fraction de seconde" plutôt que "depuis une seconde".
Plus étrange encore, le fait de commenter toute la viande de la commande awk pour la remplacer par un "print $0" (transformant l'ensemble du script en une commande grep maladroite) produit le même résultat. Je suis donc convaincu que c'est la façon dont le système exécute ce script et non quelque chose dans le script lui-même.
Pendant ce temps, dans une autre fenêtre, un simple "sudo tail -F mon-application.log | grep MATCH-TEXT" est affiché toutes les secondes environ (comme prévu).
Une idée de ce qui se passe ici ? Des indications sur la façon dont je devrais commencer à chercher la cause de ce comportement de mise en file d'attente ?