Перенаправление журнала происходит в журнал с ротацией вместо создания нового журнала

Сzsh:

#! /bin/zsh -
autoload zmv
incr='++count[$1]'
typeset -A count
zmv -n '(**/)(*)(.txt)' '$1$((incr))$3'

(удалить -nкогда счастлив)

Идея состоит в том, чтобы использовать ассоциативные массивы, ключ которых является каталогом для подсчета.

Нам нужна промежуточная переменная incr, иначе она не будет работать для имен каталогов, содержащих ].

0
29.08.2018, 18:53
2 ответа

Как только процесс открывает файл, вы можете делать с этим файлом все, что угодно, например, переименовывать его, усекать и даже удалять, но процесс все равно будет открывать этот файл. Распространенной ошибкой является то, что когда файл журнала израсходовал все дисковое пространство, его удаляют, пытаясь освободить место. Однако процесс записи в файл журнала все еще открыт, поэтому место не освобождается. Только когда процесс закроет файл, блоки, выделенные для файла, будут освобождены. (Обходным путем здесь является усечение файла, т. е. > logfile.)

В вашем случае вы переименовали файл, но процесс записи в него не знает и не заботится об этом.

У утилиты logcheckесть опция copytruncateдля таких ситуаций :она копирует лог-файл в повернутое имя, а затем усекает оригинал. Вы можете сделать то же самое:

rotateLog() {
    currentsize=$(du -k $LOGFILE | cut -f1)
    if [ $currentsize -ge $MAX_LOGFILE_SIZE ]; then
            ROTATEDLOG=$LOGFILE.$(date +%Y%m%d%H%M%S)
            cp -p $LOGFILE $ROTATEDLOG && true > $LOGFILE
    fi
}

Лучшей альтернативой было бы изменить процесс, чтобы понять, например.сигнал SIGHUP, чтобы закрыть и снова открыть файл журнала. См. команду оболочки trapдля обработки этого.

1
28.04.2021, 23:42

Основываясь на альтернативном решении, предложенном @wurtel, я заработал так:

#!/bin/bash

LOGFILE="/root/logr/simple.log"

function sighuphandler() {
    exec > >(tee "$LOGFILE") 2>&1
}

trap sighuphandler SIGHUP

LOGPATH="/root/logr"
MAX_LOGFILE_SIZE=5
rotateLog() {
    currentsize=$(du -k $LOGFILE | cut -f1)
    if [ $currentsize -ge $MAX_LOGFILE_SIZE ]; then
            savelog -dn $LOGFILE &>/dev/null
            kill -s SIGHUP $$
    fi
}

sighuphandler
while :; do
    echo "[`date "+%Y-%m-%d %H:%M:%S"`] [INFO] - A computer program can easily produce gibberish - especially if it has been provided with garbage beforehand. This program does something a little different. It takes a block of text as input and works out the proportion of characters within the text according to a chosen order. For example, an order of 2 means the program looks at pairs of letters, an order of 3 means triplets of letters and so on. The software can regurgitate random text that is controlled by the proportion of characters. The results can be quite surprising."

    ls +

    rotateLog

    sleep 5
done
0
28.04.2021, 23:42

Теги

Похожие вопросы