Добавление вывода в файл, одновременно усекающий его к строкам N

Вы могли записать сценарий обертки и использовать psexec, чтобы соединиться с удаленными машинами и выполнить скрипт, который Вы хотите запустить, если это находится на местоположении, которое доступно для тех машин. У Вас просто должен быть источник для ПК, с которым Вы соединяетесь циклично выполниться через них.

5
задан 13 April 2017 в 15:14
6 ответов

Если Ваша версия sed имеет --in-place переключатель Вы могли использовать это. Это все еще делает a cp и mv но это негласно, таким образом, сценарий выглядел бы немного менее грязным в зависимости от того, что Вы думаете о sed синтаксис. Иначе Ваш tail (Вы отсутствовали один в Вашем редактировании), и добавьте метод, способ, которым я приблизился бы к нему.

Другое использование подхода sed должен был бы сохранить Ваш журнал вверх тормашками с новейшей записью вначале.

sed -ni '1s/^/New Entry\n/;100q;p' logfile

Вот и все (кроме получения "Новой Записи", чтобы быть тем, что Вы хотите). Это сохранит прокрутку 100 файлов журнала строки в обратном хронологическом порядке. Преимущество состоит в том, что Вы не должны знать, сколько строк находится в файле (tail заботится об этом для Вас, но sed не будет). Это предполагает в некоторой степени, что Ваши записи в журнале состоят из одной строки. Если Вы регистрируете существенное количество вывода из сценария, я думаю, что Вы вернулись к tail и добавьте.

Еще одна опция, которая могла бы работать хорошо на подробный многострочный вывод, будет состоять в том, чтобы позволить файловой системе сделать работу для Вас. Каждая запись в журнале была бы отдельным файлом.

#!/bin/bash
# *** UNTESTED ***
logdir="/path/to/your/log/dir"

# run the script and log its output to a file named with the date and time
script > "$logdir/$(date "+%Y%m%dT%H%M%S").log"

# maintain the logs
# keep the last 100 days of daily logfiles
# (you could keep the last 100 hours of hourly logfiles, for example,
# by using -mmin and doing some math)

# the count is intended to keep old entries from being deleted
# leaving you with nothing if there are no new entries
count=$(find "$logdir" -maxdepth 1 -type f | wc -l)
if (( count > 100 )) 
then
    find "$logdir" -maxdepth 1 -type f -mtime +100 -delete
fi
1
ответ дан 3 December 2019 в 01:53

Вот быстрый сценарий, который я закончил тем, что использовал с этой целью.

Это избегает целой проблемы чтения и записи одновременно путем создания двух файлов, myfile и myfile.old.

#!/bin/bash

# Bail on error
set -e

# Constants
DEFAULT_NUM_LINES="1000"

# Usage message
usage()
{
    echo "Usage: last-lines [-n num] filename" 1>&2
    echo "Options:" 1>&2
    echo "    -n    Specify number of lines file iteration (default ${DEFAULT_NUM_LINES})" 1>&2
    echo "    -h    Show this help message" 1>&2
}

# Parse flags passed in on the command line
NUM_LINES="${DEFAULT_NUM_LINES}"
while [ ${#} -gt 0 ]; do
    case "$1" in
        -n)
            shift
            NUM_LINES="${1}"
            shift
            ;;
        -h|--help)
            usage
            exit
            ;;
        --)
            shift
            break
            ;;
        *)
            break
            ;;
    esac
done
case "${#}" in
    1)
        FILENAME="$1"
        ;;
    *)
        usage
        exit 1
        ;;
esac

# Run
LINE_COUNT="0"
while read LINE; do
    echo "${LINE}" >> "${FILENAME}"
    LINE_COUNT=`expr "${LINE_COUNT}" + 1`
    if [ "${LINE_COUNT}" -ge "${NUM_LINES}" ]; then
        mv "${FILENAME}"{,.old}
        LINE_COUNT="0"
    fi
done
0
ответ дан 3 December 2019 в 01:53

Это нецелесообразно, потому что нет никакого способа удалить 1-ю строку файла, не переписывая весь файл. В зависимости от размера файла, который является интенсивными действиями. Даже если Вы действительно хотели сделать это эти два метода для того, чтобы сделать так (на месте с поиском или удалить связь, воссоздайте), приведет к хвосту, не видя новых строк или думая, что все строки являются новыми.

1
ответ дан 3 December 2019 в 01:53

В целом я рекомендовал бы не волноваться о размере журнала. Стандартный способ управлять этим с logrotate. Позвольте администраторам решить как большой хотение, чтобы журнал был. Часть того, чтобы быть пользой *отклоняет приложение, которому я верю, придерживается единых стандартов, люди становятся сердитыми, когда приложение делает что-то необычное.

1
ответ дан 3 December 2019 в 01:53

Я должен был бы согласиться с Kyle на logrotate и др. Но если Вы - тупик при управлении им из Вашего приложения, попытайтесь гуглить для чего-то как: круговой файл журнала Linux

0
ответ дан 3 December 2019 в 01:53

Вот похожий пост, который дал мне два хороших ответа: Превращение файла журнала в своего рода кольцевой буфер

У меня была та же проблема, и я с радостью использую ulogbufd .

0
ответ дан 3 December 2019 в 01:53

Теги

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