#!/bin/bash +x #Se logrotate.sh si rileva lanciato da terminale (man tty), # # configura rsyslog per dirigere i messaggi etichettati local1 con priorità non inferiore a # warning sul file /var/log/my.log # # configura la cron table di root per esegure se stesso ogni giorno lavorativo alle 23:00 # #In caso contrario, effettua la "rotazione" del file /var/log/my.log # # rinomina eventuali file /var/log/my.log.N.bz2 in /var/log/my.log.N+1.bz2 # (per ogni N esistente) # rinomina /var/log/my.log in /var/log/my.log.1 e lo comprime con bzip2 # ricarica rsyslogd (più in generale il processo che vi sta scrivendo man fuser) shopt -s extglob #Usiamo extglob per selezionare moltiplicatori nella pathname expansion del for if ! [[ $(tty) =~ "not a tty" ]] ; then { echo "local1.warning /var/log/my.log" > /etc/rsyslog.d/mylog.conf PERIODO='0 23 * * 1-5' COMANDO=$(readlink -f "$0") sudo echo "$PERIODO $COMANDO root" >> /etc/crontab } else { #rinomina file facendo N=N+1 for F in /var/log/my.log.+([[:digit:]]).bz2 ; do { #una o più occorrenze di digit, serve shopt extglob N=$(cut -f3 -d. <<< "$F") let N++ mv "$F" "/var/log/my.log.$N.bz2" } done FILE="/var/log/my.log" if [[ -f "$FILE" ]] ; then { #testa se esiste il file mv "$FILE" "$FILE".1 bzip2 -c "$FILE".1 > "$FILE".1.bz2 } else { echo "File /var/log/my.log inesistente" ; exit 1; } fi sudo systemctl restart rsyslog #ricaricare rsyslogd. Come fare a riavviare il processo che sta scrivendo sul file, dopo aver controllato? } fi