Ho usato, invece di mv
, il cp
comando per ottenere che tu sia in grado di avere alcuni file di registro sul posto dove è in esecuzione un software. Forse nella diversa home directory dell'utente o nella directory dell'app e tutti i log sono in un unico posto come hardlink. Se si utilizza il mv
comando si perde il collegamento reale. Se si utilizza il cp
comando invece si manterrà questo collegamento reale.
il mio codice è qualcosa del tipo:
TMP_FILE="$(mktemp "${TMPFILENAME}.XXX")"
for FILE in "${LOGFILE_DIR}"/* ; do
tail -n $MAXLINES "${FILE}" > "${TMP_FILE}"
if [ $(ls -g "${TMP_FILE}" | awk '{print $4}') -lt $(ls -g "${FILE}" | awk '{print $4}') ] ; then
cp "${TMP_FILE}" "${FILE}"
fi
done
Quindi, se i file si trovano sullo stesso filesystem, potresti dare anche alcuni diritti diversi agli utenti e nel ${LOGFILE_DIR}
modificarne la lunghezza come faccio io.
Se è il mv
comando perdi il collegamento tra i file e quindi il tuo secondo file non è più connesso al primo - forse posto altrove.
Se dall'altra parte non permetti a qualcuno di cancellare il file, i tuoi registri rimarranno insieme e sarai ben controllato tramite il tuo script.
logrotate
forse più bello. Ma sono contento di questa soluzione.
Non essere disturbato dal "", ma nel mio caso ci sono alcuni file con spazi e altre lettere speciali in e Se non faccio il "" in giro o il {} l'intero lotto non funziona bene.
Per esempio c'è un Dir in cui i file più vecchi ottiene automatizzati zip in una OLDFILE.zip
e tutto ciò che viene compresso è così elencati nel file .zip_log
in modo che il .zip_log
è in questo Dir pure ma nel LOGFILE_DIR
quando ci sono andata con:
ln .zip_log "${LOGFILE_DIR}/USER_ZIP_log"
il file uguale in quanto è un collegamento reale.
logrotate
è la soluzione elegante