Вы могли записать сценарий обертки и использовать psexec, чтобы соединиться с удаленными машинами и выполнить скрипт, который Вы хотите запустить, если это находится на местоположении, которое доступно для тех машин. У Вас просто должен быть источник для ПК, с которым Вы соединяетесь циклично выполниться через них.
Если Ваша версия 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
Вот быстрый сценарий, который я закончил тем, что использовал с этой целью.
Это избегает целой проблемы чтения и записи одновременно путем создания двух файлов, 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
Это нецелесообразно, потому что нет никакого способа удалить 1-ю строку файла, не переписывая весь файл. В зависимости от размера файла, который является интенсивными действиями. Даже если Вы действительно хотели сделать это эти два метода для того, чтобы сделать так (на месте с поиском или удалить связь, воссоздайте), приведет к хвосту, не видя новых строк или думая, что все строки являются новыми.
В целом я рекомендовал бы не волноваться о размере журнала. Стандартный способ управлять этим с logrotate. Позвольте администраторам решить как большой хотение, чтобы журнал был. Часть того, чтобы быть пользой *отклоняет приложение, которому я верю, придерживается единых стандартов, люди становятся сердитыми, когда приложение делает что-то необычное.
Вот похожий пост, который дал мне два хороших ответа: Превращение файла журнала в своего рода кольцевой буфер
У меня была та же проблема, и я с радостью использую ulogbufd .