$ find / -type f -size 0 -exec ls -l {} \;
В одной из моих систем каждый день создается системный журнал аудита. К имени журнального файла добавляется номер, что позволяет сразу определить, какой файл создан позже, а какой -pаньше. Например, версии файла admin.log нумеруются последовательно: admin.log.001, admin.log. O02 и т. д. Ниже приведена команда find, которая удаляет все файлы admin.log, созданные более семи дней назад:
$ find /logs -name 'admin.log. [0-9] [0-9][О-9] ' — atime +7 exec \ rm {} \;
2.2. Команде xargs
При наличии опции -exec команда find передает указанной команде все найденные файлы, которые обрабатываются за один раз. К сожалению, в некоторых системах длина командной строки ограниченна, поэтому при обработке большого числа файлов может быть выдано сообщение об ошибке, которое обычно гласит: "Too many arguments" (слишком много аргументов) или "Arguments too long" (слишком большой список аргументов). В этой ситуации на помощь приходит команда xargs. файлы, полученные от команды find, она обрабатывает порциями, а не все сразу.
Рассмотрим пример, в котором команда find возвращает список всех файлов, имеющихся в системе, а команда xargs выполняет для них команду file, проверяющую тип каждого файла:
$ find / -type f -print | xargs file
/etc/protocols: English text /etc/securetty: ASCII text
Ниже приведен пример, демонстрирующий поиск файлов дампа, имена которых команда echo помешает в файл /tmp/core.log.
$ find / -name core -print | xargs echo > /tmp/core.log
В следующем примере в каталоге /apps/audit выполняется поиск всех файлов, к которым другие пользователи имеют полный доступ. Команда chmod удаляет для них разрешение на запись:
$ find /apps/audit -perm -7 -print | xargs chmod o‑w
Завершает наш перечень пример, в котором команда grep ищет файлы, содержащие слово "device":
$ find / -type f -print | xargs grep "device"
2.3. Заключение
Команда find представляет собой прекрасный инструмент поиска различных файлов по самым разнообразным критериям. Благодаря опции -exec, а также команде xargs найденные файлы могут быть обработаны практически любой системной командой.
ГЛАВА 3
Выполнение команд в фоновом режиме
Когда вы работаете за терминалом, во многих случаях неудобен вывод на экране результатов выполнения заданий в системе, ведь в это время вы можете быть заняты другими важными делами, например просмотром сообщений электронной почты. Кроме того, иногда возникает необходимость выполнять задания, интенсивно использующие дисковые ресурсы или ресурсы центрального процессора, в то время, когда загрузка системы минимальна. Для этих целей специально разработаны команды, которые позволяют запускать задания в фоновом режиме, а не на экране терминала.
В этой главе рассматриваются следующие темы:
• планирование заданий с помощью программы cron;
• планирование заданий с помощью команды at;
• выполнение заданий в фоновом режиме;
• выполнение заданий с помощью команды nohup.
cron
Системный планировщик, применяемый для многократного выполнения заданий в указанные периоды времени; является демоном, т. е. работает только в фоновом режиме
at
Команда, которая служит для однократного выполнения заданий в назначенное время
&
Оператор, позволяющий перевести задание в фоновый режим
nohup
Команда для перевода задания в фоновый режим таким образом, чтобы оно не реагировало на сигнал HUP (hang‑up -oтбой) и продолжало выполняться, даже если запустивший его пользователь выйдет из системы
3.1. Планировщик cron и команда crontab
Программа cron является основным системным планировщиком, служащим для выполнения различных заданий в фоновом режиме. Команда crontab позволяет пользователям создавать, редактировать и удалять инструкции для программы cron посредством специального crontab–файла. У каждого пользователя может быть свой crontab–файл, но в крупных системах администратор (пользователь root) обычно исключает данную возможность. В этом случае администратор создает вспомогательные файлы cron.deny и cron.allow, содержащие списки пользователей, которым соответственно запрещено и разрешено выполнять команду crontab.
3.1.1. Структура crontab–файла
Чтобы планировать выполнение заданий в определенное время, нужно знать формат записей в crontab–файле. Каждая запись содержит шесть полей;
1
Минуты — 0—59
2
Часы — 0—23 (0 означает полночь)
3
День месяца — 1—31
4
Месяц — 1—12
5
День недели — 0—7 {0 и 7 означает воскресенье)
6
Команда, которая должна быть выполнена
Общий формат записи таков:
минуты часы день_месяца месяц деиь_нвдели команда
Все поля разделяются пробелами.
В первых пяти полях записи могут быть указаны диапазоны значений. Например, для того чтобы обеспечить выполнение задания с понедельника по пятницу, надлежит указать в пятом поле значение 1-5,
Допускается также задание списка значений, разделенных запятыми. Если,
например, задание должно быть выполнено только в понедельник и четверг, следует
ввести 1, 4.
Символ звездочки (*) — это обозначение диапазона "от первого до последнего", т. е. каждую минуту, каждый день и т. д. Если указан диапазон, то можно задать для него шаг пропуска с помощью символа /. Например, запись */2 означает "каждый второй".
В crontab–файле допускаются комментарии. В начале строки комментария должен стоять символ #.
3.1.2. Примеры записей в crontab–файле
Запись
30 21 * * * /apps/bin/cleanup.sh
означает выполнение сценария cteanup.sh в каталоге /apps/bin каждый вечер в 21:30. Запись
45 4 1,10,22 * * /apps/bin/backup.sh
означает выполнение сценария backup.sh в каталоге /apps/bin в 4:45 утра 1–го, 10–го и 22–го числа каждого месяца. Запись
10 1 * * 6,0 /bin/find -name "core" — exec rm {} \;
означает выполнение команды find для удаления файлов дампа в 1:10 ночи по субботам и воскресеньям. Запись
0,30 18-23 * * * /apps/bin/dbcheck.sh
означает выполнение сценария dbchecksh в каталоге /apps/bin каждые полчаса между 18:00 и 23:00.
Запись
0 23 * * 6 /apps/bin/qtrend.sh
означает выполнение сценария qtrend.sh в каталоге /apps/bin в 23:00 каждую субботу. При выполнении команд и сценариев, указанных в crоntab–файле, следует убедиться, что корректно заданы все необходимые переменные среды. Программа cron не сделает это за вас: это не входит в ее компетенцию. Поэтому локальные переменные среды должны быть установлены вручную, в отличие от глобальных переменных, которые устанавливаются автоматически. Данная задача может быть решена непосредственно в crontab–файле за счет создания записи следующего вида:
имя_переменной=значение
Если программа cron не сможет выполнить поступившую команду, пользователь получит электронное сообщение, в котором будут указаны причины неудачи.