J'ai un script bash qui s'exécute tant que la machine Linux est sous tension. Je le démarre comme indiqué ci-dessous:
( /mnt/apps/start.sh 2>&1 | tee /tmp/nginx/debug_log.log ) &
Après son lancement, je peux voir la commande tee dans ma sortie ps comme indiqué ci-dessous:
$ ps | grep tee
418 root 0:02 tee /tmp/nginx/debug_log.log
3557 root 0:00 grep tee
J'ai une fonction qui surveille la taille du journal produit par tee et tue la commande tee lorsque le journal atteint une certaine taille:
monitor_debug_log_size() {
## Monitor the file size of the debug log to make sure it does not get too big
while true; do
cecho r "CHECKING DEBUG LOG SIZE... "
debugLogSizeBytes=$(stat -c%s "/tmp/nginx/debug_log.log")
cecho r "DEBUG LOG SIZE: $debugLogSizeBytes"
if [ $((debugLogSizeBytes)) -gt 100000 ]; then
cecho r "DEBUG LOG HAS GROWN TO LARGE... "
sleep 3
#rm -rf /tmp/nginx/debug_log.log 1>/dev/null 2>/dev/null
kill -9 `pgrep -f tee`
fi
sleep 30
done
}
À ma grande surprise, tuer la commande tee tue également par l'instance start.sh. Pourquoi est-ce? Comment puis-je terminer la commande tee mais que mon start.sh continue de s'exécuter? Merci.
tee -a
pourtee
ouvrir le fichier en mode ajout, sinon, tee continuera à écrire dans le fichier avec le même décalage après l'avoir tronqué (et sur les systèmes qui ne prennent pas en charge les fichiers clairsemés comme sur macOS qui réallouer la section du fichier menant à cette position, en prenant deux fois plus d'espace disque).logger -s
syslog pour prendre en charge la journalisation (-s
pour également imprimer sur stderr).logrotate
. Excellent programmeExpliquer le "pourquoi"
En bref: si les échecs d'écriture ne provoquaient pas la fermeture d'un programme (par défaut), nous aurions un gâchis. Considérez
find . | head -n 10
- vous ne voulezfind
pas continuer à courir, à scanner le reste de votre disque dur, aprèshead
avoir déjà pris les 10 lignes nécessaires et continuer.Faire mieux: faites pivoter l'intérieur de votre enregistreur
Considérez ce qui suit, qui n'utilise pas
tee
du tout, comme exemple démonstratif:Si exécuté en tant que:
... cela commencera par ajouter à
/tmp/nginx/debug_log
, renommer le fichier/tmp/nginx/debug_log.old
lorsque plus de 100 Ko de contenu sont présents. Parce que l'enregistreur lui-même effectue la rotation, il n'y a pas de canal cassé, pas d'erreur et pas de fenêtre de perte de données lorsque la rotation a lieu - chaque ligne sera écrite dans un fichier ou un autre.Bien sûr, l'implémentation de cela dans bash natif est inefficace, mais ce qui précède est un exemple illustratif. Il existe de nombreux programmes disponibles qui mettront en œuvre la logique ci-dessus pour vous. Considérer:
svlogd
, l'enregistreur de service de la suite Runit.s6-log
, une alternative activement maintenue de la suite skanet.multilog
de DJB Daemontools, le grand-père de cette famille d'outils de supervision et de surveillance de processus.la source