Eu usei, em vez de mv
, o cp
comando para conseguir que você possa ter alguns arquivos de log no local em que um software está sendo executado. Talvez no diretório inicial do usuário diferente ou no diretório do aplicativo e tenha todos os logs em um só lugar como links físicos. Se você usar o mv
comando, perderá o link físico. Se você usar o cp
comando, manterá esse link físico.
meu código é algo como:
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
Portanto, se os arquivos estiverem no mesmo sistema de arquivos, você também poderá conceder direitos diferentes aos usuários e ${LOGFILE_DIR}
modificar o tamanho como eu.
Se for o mv
comando, você perde o hardlink entre os arquivos e, portanto, seu segundo arquivo não está mais conectado ao primeiro - talvez colocado em outro lugar.
Se, em outro lugar, você não permitir que alguém apague o arquivo, seus logs permanecerão juntos e serão bem controlados por meio de seu próprio script.
logrotate
talvez melhor. Mas estou feliz com esta solução.
Não se perturbe com o "", mas no meu caso existem alguns arquivos com espaços e outras letras especiais. Se eu não fizer o "" por aí ou o {}, o lote todo não funcionará bem.
Por exemplo, há um diretório em que arquivos mais antigos são automatizados compactados em um OLDFILE.zip
arquivo e tudo o que é compactado também é listado em Arquivo, .zip_log
portanto, também .zip_log
está neste diretório, mas no LOGFILE_DIR
que eu tenho com:
ln .zip_log "${LOGFILE_DIR}/USER_ZIP_log"
o arquivo igual, pois é um link físico.
logrotate
é a solução elegante