TL;DR - Hier, j'ai écrit un ensemble d'outils pour enregistrer les exécutions de programmes et les sessions.
Actuellement disponible sur https://github.com/wwalker/quick-log
En tant qu'administrateur, je veux toujours enregistrer la sortie d'une commande, souvent pas un script. Pour résoudre ce problème, j'ai écrit quelques trucs. Le plus simple est d'utiliser le programme "script" comme xX0v0Xx l'a mentionné. J'ai trouvé que l'appel à script (sans aucun argument) me faisait souvent écraser la sortie d'un script précédent. J'ai donc créé cet alias. Tout ce qu'il fait est d'empêcher l'écrasement. Vous avez besoin d'un répertoire ~/tmp.
$ alias scr='script ~/tmp/typescript-$(date +%FT%T)'
$ scr
Script started, file is /home/wwalker/tmp/typescript-2019-12-05T18:56:31
$
C'est génial lorsque je veux assister à une session interactive.
Lorsque je veux enregistrer la sortie d'une commande (script ou binaire), je veux soit la sortie exacte, soit la sortie avec les timestamps devant chaque ligne. J'ai donc écrit ces deux fonctions bash :
alias iso8601="date +%Y-%m-%dT%H:%M:%S"
justlog(){
name=$(basename "$1")
log=~/logs/${name}-$(iso8601)
"$@" > "$log" 2>&1
}
timelog(){
name=$(basename "$1")
log=~/logs/${name}-$(iso8601)
# https://github.com/wwalker/ilts
# You could replace ilts with ts
# /usr/bin/ts %FT%H:%M:%.S
"$@" |& ilts -S -E > "$log" 2>&1
}
Exécutez votre commande comme vous le feriez normalement :
justlog run rcn rcn-work\\\\\* 'ps -ef -o lstart,cmd | grep [s]upervisor'
ou
timelog run rcn rcn-work\\\\\* 'ps -ef -o lstart,cmd | grep [s]upervisor'
Cela vient de créer 2 fichiers appelés :
wwalker@polonium:~ $ ls -l ~/logs/run*
-rw-r--r-- 1 wwalker wwalker 10495 2019-12-05 18:21:14.985 /home/wwalker/logs/run-2019-12-05T18:21:13
-rw-r--r-- 1 wwalker wwalker 1694 2019-12-05 18:24:02.878 /home/wwalker/logs/run-2019-12-05T18:24:01
-rw-r--r-- 1 wwalker wwalker 7623 2019-12-05 18:25:07.873 /home/wwalker/logs/run-2019-12-05T18:25:06
-rw-r--r-- 1 wwalker wwalker 10296 2019-12-05 18:34:59.546 /home/wwalker/logs/run-2019-12-05T18:34:57
Mais, attendez il y a plus !!
Je ne voulais pas avoir à faire un ls pour trouver le nom du fichier journal que justlog ou timelog venait de créer pour moi. J'ai donc ajouté 3 fonctions supplémentaires :
newestlog(){
name=$(basename "$1")
ls ~/logs/"${name}"* | tail -1
}
viewlog(){
name=$(basename "$1")
view $( newestlog "$name" )
}
lesslog(){
name=$(basename "$1")
less $( newestlog "$name" )
}
Donc, vous lancez votre commande avec justlog (ou timelog), et ensuite vous utilisez simplement lesslog ou viewlog (je vais probablement créer un log emacs pour ces personnes) :
justlog run rcn rcn-work\\\\\* 'ps -ef -o lstart,cmd | grep [s]upervisor'
lesslog run
C'est ça, pas de ls ~/tmp
, pas de jeux de complétion de tabulation pour trouver le nom du fichier. Il suffit de lancer lesslog (ou viewlog si vous aimez utiliser vim pour regarder les logs).
Mais, attendez ! Ce n'est pas tout !
"J'utilise grep tout le temps sur mes fichiers journaux" - Et la réponse est, vous l'avez deviné, greplog
Tout d'abord, récupérez le texte de tous les fichiers /etc/cron.d/atop du serveur 800 qui sont cassés :
justlog fordcrun 'cat /etc/cron.d/atop; md5dum /etc/cron.d/atop'
Ensuite, obtenez les noms d'hôtes (sur la ligne au-dessus de la sortie dans le fichier :-) ) avec greplog :
wwalker@polonium:~ $ greplog fordcrun -B1 -F "0 0 * * root"
int-salt-01:
0 0 * * root systemctl restart atop
--
rcn-pg-01:
0 0 * * root systemctl restart atop
rcn-pg-02:
0 0 * * root systemctl restart atop
rcn-pg-03:
0 0 * * root systemctl restart atop