Дейв Тейлор - Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание
- Название:Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание
- Автор:
- Жанр:
- Издательство:Питер
- Год:2017
- Город:СПб.
- ISBN:978-5-496-03029-8
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Дейв Тейлор - Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание краткое содержание
Цель этой книги — продемонстрировать практические приемы программирования сценариев на bash и познакомить с самыми распространенными утилитами на коротких и компактных примерах, не вдаваясь в излишние подробности. Экспериментируйте с этими сценариями — ломайте, исправляйте и приспосабливайте их под свои нужды, чтобы понять, как они работают. Только так вы сможете решать самые сложные задачи.
Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Результаты
Сам сценарий фактически ничего не выводит и отображает только результаты выполнения сценариев в crontab, если только не произойдет ошибка где-то внутри сценария или внутри одного из заданий cron.
Усовершенствование сценария
Некоторые задания не должны выполняться чаще, чем раз в неделю или раз в месяц, поэтому следовало бы добавить проверку, чтобы гарантировать это. Кроме того, некоторые повторяющиеся системные задания вполне могут запускаться из cron, поэтому нельзя с уверенностью говорить, что они не выполнялись, если сценарий docron не запускался.
Как одно из решений можно создать три пустых файла, по одному для ежедневных, еженедельных и ежемесячных заданий, и затем добавить новые записи в каталоги /etc/daily, /etc/weekly и /etc/monthly , обновляющие время последней модификации соответствующего файла командой touch. Это решило бы половину проблемы: сценарий docron мог бы проверять, когда повторяющееся задание cron выполнялось последний раз, и сразу прекращать выполнение, если прошло недостаточно времени.
Но это решение не обрабатывает, например, такую ситуацию: через шесть недель после последнего запуска ежемесячных заданий cron администратор запустил сценарий docron, чтобы выполнить ежемесячные задания. Затем, через четыре дня кто-то из сотрудников позабыл выключить свой компьютер и cron выполнил ежемесячные задания. Как cron узнает, что не должен их выполнять?
В соответствующий каталог можно добавить два сценария. Один должен запускаться первым из run-script или periodic (стандартные инструменты запуска заданий cron) и снимать бит права на выполнение со всех сценариев в каталоге, кроме парного ему сценария, который должен снова устанавливать бит права на выполнение после того, как run-script или periodic просканирует каталог и установит, что ничего не должен выполнять: в каталоге нет выполняемых файлов и поэтому cron не запустит их. Однако это не идеальное решение, потому что не гарантирует определенный порядок запуска, а если мы не сможем гарантировать порядок, в котором будут запускаться новые сценарии, все решение становится непригодным.
В действительности эта дилемма не имеет надежного решения. Если только речь не идет о создании обертки для run-script или periodic, которая будет знать, как управлять запоминанием времени, чтобы гарантировать невозможность слишком частого запуска заданий. Впрочем, не исключено, что мы вообще зря беспокоимся об этом.
№ 50. Ротация файлов журналов
Пользователи, не имеющие большого опыта использования Linux, могут удивиться, как много команд, утилит и демонов регистрируют события в файлах системных журналов. Даже при наличии больших объемов дискового пространства важно следить за размерами этих файлов и, конечно, их содержимым.
В результате многие системные администраторы предусматривают последовательность команд, которые помещаются в начало утилит, предназначенных для анализа файлов журналов. Пример такой последовательности приведен ниже:
mv $log.2 $log.3
mv $log.1 $log.2
mv $log $log.1
touch $log
Если запускать эту группу команд раз в неделю, в вашем распоряжении всегда будет месячный архив информации из файла журнала, разделенный на порции недельного объема. Однако легко можно создать сценарий, который проделает ту же операцию сразу со всеми файлами журналов в каталоге /var/log , освободив тем самым сценарии анализа от лишнего бремени и организовав ротацию файлов даже в течение месяцев, когда администратор ничего не анализировал.
Сценарий в листинге 6.12 выполняет обход всех файлов в каталоге /var/log , имена которых соответствуют определенному набору критериев, проверяет график ротации каждого подходящего файла и время последнего изменения, чтобы убедиться в необходимости ротации. Если время пришло, сценарий проводит ее.
Код
Листинг 6.12.Сценарий rotatelogs
#!/bin/bash
# rotatelogs — выполняет ротацию файлов журналов в /var/log с целью
#·· архивирования и чтобы предотвратить чрезмерное увеличение файлов
#·· в размерах. Этот сценарий использует файл конфигурации, в котором
#·· можно настроить период ротации каждого файла. Записи в конфигурационном
#·· файле имеют формат logfilename=duration, где duration определяет
#·· количество дней. Если запись в конфигурационном файле для журнала
#·· logfilename отсутствует, rotatelogs будет выполнять ротацию такого
#·· журнала с частотой раз в семь дней. Если для журнала установлена
#·· продолжительность периода ротации, равная нулю, этот журнал будет
#·· игнорироваться сценарием.
logdir="/var/log"····# У вас журналы могут находиться в другом каталоге.
config="$logdir/rotatelogs.conf"
mv="/bin/mv"
default_duration=7·· # По умолчанию ротация выполняется через 7 дней.
count=0
duration=$default_duration
if [! -f $config]; then
··# Файл конфигурации отсутствует? Выйти. Эту проверку можно убрать
··#·· и в отсутствие конфигурационного файла просто использовать настройки
··#·· по умолчанию.
··echo "$0: no config file found. Can't proceed." >&2
··exit 1
fi
if [! -w $logdir −o! −x $logdir]; then
··# −w — право на запись, а −x — право на выполнение. Для создания
··#·· новых файлов в каталогах Unix или Linux необходимы оба. Если
··#·· права отсутствуют, завершить выполнение с выводом сообщения.
··echo "$0: you don't have the appropriate permissions in $logdir" >&2
··exit 1
fi
cd $logdir
# Как бы нам ни хотелось использовать в команде find стандартные обозначения,
#·· такие как: digit:, многие версии find не поддерживают POSIX-совместимые
#·· классы символов — поэтому [0–9].
# Замысловатая команда find подробно обсуждается далее в этом разделе.
#·· Не пропустите, если вам интересно!
for name in $(
find. -maxdepth 1 −type f −size +0c! −name '*[0–9]*' \
····! -name '\.*'! -name '*conf' −print | sed 's/^\.\///')
do
··count=$(($count + 1))
··# Извлечь соответствующую запись из конфигурационного файла.
··duration="$(grep "^${name}=" $config|cut −d= −f2)"
··if [-z "$duration"]; then
····duration=$default_duration # Если совпадений нет, использовать период··································по умолчанию.
··elif ["$duration" = "0"]; then
····echo "Duration set to zero: skipping $name"
····continue
··fi
··# Подготовить имена файлов для ротации. Это просто:
··back1="${name}.1"; back2="${name}.2";
··back3="${name}.3"; back4="${name}.4";
··# Если самый свежий архив журнала (back1) изменялся не позднее
Интервал:
Закладка: