355 500 произведений, 25 200 авторов.

Электронная библиотека книг » Дэвид Тейнсли » Linux и UNIX: программирование в shell. Руководство разработчика » Текст книги (страница 3)
Linux и UNIX: программирование в shell. Руководство разработчика
  • Текст добавлен: 15 октября 2016, 00:39

Текст книги "Linux и UNIX: программирование в shell. Руководство разработчика"


Автор книги: Дэвид Тейнсли



сообщить о нарушении

Текущая страница: 3 (всего у книги 25 страниц)

$ find . – perm 755 -print

Если перед значением режима вставить дефис, будет произведен поиск файлов, Для которых установлены все указанные биты разрешений, остальные биты при этом

игнорируются. Например, следующая команда ищет файлы, к которым другие пользователи имеют полный доступ:

$ find . – perm -007 -print

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

2.1.3. Опция -prune

Когда вы не хотите вести поиск в том или ином каталоге, воспользуйтесь опцией -prune. Она служит указанием остановить поиск на текущем путевом имени. Если путевое имя указывает на каталог, команда find не будет заходить в него. При наличии опции -depth опция -prune игнорируется.

Следующая команда проводит поиск в текущем каталоге, не заходя в подкаталог /bin:

$ find . – name "bin" – prune -o -print

2.1.4. Опции -user и -nouser

Чтобы найти файлы, принадлежащие определенному пользователю, укажите в команде find опцию -user, а также имя пользователя. Например, поиск в начальном каталоге файлов, принадлежащих пользователю dave, осуществляется посредством такой команды:

$ find ~ -user dave -print

Поиск в каталоге /etc файлов, принадлежащих пользователю uucp, выполняет

следующая команда: |

$ find /etc -user uucp -print

Благодаря опции -nouser возможен поиск файлов, принадлежащих несуществующим пользователям. При ее использовании производится поиск файлов, для владельцев которых нет записи в файле /etc/passwd. Конкретное имя пользователя указывать не нужно: команда find выполняет всю необходимую работу сама. Чтобы найти все файлы, которые принадлежат несуществующим пользователям и находятся в каталоге /hоте, задайте вот такую команду:

$ find /home -nouser -print

2.1.5. Опции -group и -nogroup

Опции -group и -nogroup аналогичны опциям -user и -nouser и позволяют искать файлы, принадлежащие заданной группе или несуществующим группам. Ниже приведена команда для нахождения в каталоге /apps всех файлов, которыми владеют пользователи группы accts:

$ find /apps -group accts -print

Следующая команда ищет во всей системе файлы, принадлежащие несуществующим группам:

$ find / -nogroup -print

2.1.6. Опция -mtime

Опцию -mtime следует применять при поиске файлов, доступ к которым осуществлялся x дней назад. Если аргумент опции снабдить знаком ' – ', будут отобраны файлы, к которым не было доступа в течение x дней. Аргумент со знаком '+' приводит к противоположному результату – производится отбор файлов, доступ к которым осуществлялся на протяжении последних х дней.

Найти все файлы, которые не обновлялись в течение последних пяти дней, позволяет следующая команда:

$ find / -mtime -5 -print

Ниже приведена команда, выполняющая поиск в каталоге /var/adm файлов, которые обновлялись в течение последних трех дней:

$ find /var/adm -mtime +3 -print

2.1.7. Опция -newer

Если необходимо найти файлы, доступ к которым осуществлялся в промежутке времени между обновлениями двух заданных файлов, воспользуйтесь опцией -newer. Общий формат ее применения таков:

–newer старый_файл ! —newer новый_файл

Знак '!' является оператором логического отрицания. Он означает: найти файлы, которые новее, чем старый_файл, но старее, чем новый_файл.

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

rwxr‑xr‑x 1 root root 92 Apr 18 11:18 age.awk

rwxrwxr‑x 1 root root 1054 Apr 20 19:37 belts.awk

Для нахождения всех файлов, которые обновлялись позже, чем age.awk, но раньше, чем belts.awk, выполните следующую команду (применение опции -exec описано чуть ниже):

$ find . – newer age.awk! – newer beIt*.awk -exec ls -l {} ;

-rwxrwxr‑x 1 root root 62 Apr 18 11:32 . /who.awk

–rwxrwxr‑x 1 root root 4 9 Apr 18 12:05 ./group.awk

–rw‑r–r– 1 root root 201 Apr 20 19:30 ./grade2.txt

–rwxrwxr‑x 1 root root 1054 Apr 20 19:37 ./belts.awk

Ho как быть, если необходимо найти файлы, созданные, скажем, в течение последних двух часов, а у вас нет файла, сформированного ровно два часа назад, с которым можно было бы сравнивать? Создайте такой файл! Для этой цели предназначена команда touch -t, которая создает файл с заданной временной меткой в формате ММДДччмм (месяц–день–часы–минуты). Например:

$ touch -t 05042140 dstamp

$ ls -l dstamp

–rw‑r—r– I dave admin 0 May 4 21:40 dstamp

В результате будет получен файл, дата создания которого – 4 мая, время создания —21:40 (предполагается, что текущее время – 23:40). Теперь можно применить

команду find с опцией -newer для нахождения всех файлов, которые обновлялись в течение последних двух часов:

$ find . – newer dstamp -print

2.1.8. Опция -type

Операционные системы UNIX и Linux поддерживают различные типы файлов (см. главу 1). Поиск файлов нужного типа осуществляется посредством команды, find с опцией -type. Например, для нахождения всех подкаталогов в каталоге /etc воспользуйтесь такой командой:

$ find /etc -type d -print

Чтобы получить список всех файлов, но не каталогов, выполните следующую команду:

$ find . ! – type d -print

Ниже приведена команда, которая предназначена для поиска всех символических ссылок в каталоге /etc.

$ find /etc -type l -print

2.1.9. Опция -size

В процессе поиска размер файла указывается с помощью опции -size n, где N -pазмер файла в блоках по 512 байтов. Возможные аргументы имеют следующие значения:

+N – поиск файлов, размер которых больше заданного,

– N – меньше заданного,

N -pавен заданному.

Если в аргументе дополнительно указан символ 'c', то размер считается заданным в байтах, а не в блоках, а если символ к – в килобайтах.

Для поиска файлов, размер которых превышает 1 Мб, предназначена команда

$ find . – size +1000k -print

Следующая команда выполняет поиск в каталоге /home/apache файлов, размер которых в точности равен 100 байтам:

$ find /home/apache -size 100c -print

Произвести поиск файлов, размер которых превышает 10 блоков (5120 байтов), позволяет приведенная ниже команда:

$ find . – size +10 -print

2.1.10. Опция -depth

Опция -depth позволяет организовать поиск таким образом, что сначала проверяются все файлы текущего каталога (и рекурсивно все его подкаталоги) и только в конце – запись самого каталога. Эта опция широко применяется при создании списка файлов, помещаемых в архив на магнитной ленте с помощью команды cpio или tar, так как в этом случае сначала записывается на ленту образ каталога и лишь после этого задаются права доступа к нему. Это позволяет пользователю архивировать те каталоги, для которых у него нет разрешения на запись.

Следующая команда выводит список всех файлов и подкаталогов текущего каталога:

$ find . – name "*" – print -о -name ".*" – print -depth

Вот как могут выглядеть результаты ее работы:

./.Xdefaults

./.bash_logout

./.bash_proflie

./.bashrc

./.bash_history

./file

./Dir/file1

./Dir/file2

./Dir/file3

./Dir/Subdir/file4

./Dir/Subdir

./Dir

2.1.11. Опция -mount

Поиск файлов только в текущей файловой системе, исключая другие смонтированные файловые системы, обеспечивает опция -mount команды find . В следующем примере осуществляется поиск всех файлов с расширением хс в текущем разделе диска:

$ find / -name "*.XC" – mount -print

2.1.12. Поиск файлов с последующей архивацией командой cpio

Команда cpio применяется главным образом для записи файлов на магнитную ленту и чтения их с ленты. Очень часто она используется совместно с командой find, по каналу принимая от нее список файлов.

Вот как выполняется запись на магнитную ленту содержимого каталогов /etc, /home и /apps:

$ cd /

$ find etc home apps -depth -print | cpio -ov > dev/rmt0

Опция -o команды cpio задает режим записи файлов на ленту. Опция -v (verbose -cловесный режим) является указанием команде cpio сообщать о каждом обрабатываемом файле.

Обратите внимание на то, что в именах каталогов отсутствует начальный символ '/'. Таким образом задаются относительные путевые имена архивируемых каталогов, что при последующем чтении файлов из архива позволит воссоздавать их в любой части операционной системы, а не только в корневом каталоге.

2.1.13. Опции -exec и -ok

Предположим, вы нашли нужные файлы и хотите выполнить по отношению к ним определенные действия. В этом случае вам понадобится опция -exec (некоторые системы позволяют с помощью опции -exec выполнять только команды ls или

ls -l). Многие пользователи применяют опцию -exec для нахождения старых файлов, подлежащих удалению. Я рекомендую вместо команды rm выполнить сначала команду ls, чтобы убедиться в том, что команда find нашла именно те файлы, которые нужно удалить.

После опции -exec следует указать выполняемую команду, а затем ввести фигурные скобки, пробел, обратную косую черту и, наконец, точку с запятой. Рассмотрим пример:

$ find . – type f -exec ls -1 {} ;

-rwxr‑xr‑x

10

root

wheel

1222

Jan 4 1993

./sbin/C80

-rwxr‑xr‑x

10

root

wheel

1222

Jan 4 1993

./sbin/Normal

-rwxr‑xr‑x

10

root

wheel

1222

Jan 4 1993

./sbin/Revvid

Здесь выполняется поиск обычных файлов, список которых отображается на экране с помощью команды ls -l.

Чтобы найти файлы, которые не обновлялись в каталоге /logs в течение последних пяти дней, и удалить их, выполните следующую команду:

$ find /logs -type f -mtime +5 -exec rm {} ;

Следует соблюдать осторожность при перемещении и удалении файлов. Пользуйтесь опцией -ok, которая позволяет выполнять команды mv и rm в безопасном режиме (перед обработкой очередного файла выдается запрос на подтверждение). В следующем примере команда find находит файлы с расширением LOG, и если какой‑то файл создан более пяти дней назад, она удаляет его, но сначала просит вас подтвердить эту операцию:

$ find . – name "*.LOG" – mtime +5 -ok rm {} ;

< rm… ./nets. LOG > ? у

Для удаления файла введите у, а для предотвращения этого действия – n.

2.1.14. Дополнительные примеры использования команды find

Рассмотрим еще несколько примеров, иллюстрирующих применение команды find . Ниже показано, как найти все файлы в своем начальном каталоге:

$ find ~ -print

Найти все файлы, для которых установлен бит SUID, позволяет следующая команда:

$ find . – type f -perm +4000 -print

Чтобы получить список пустых файлов, воспользуйтесь такой командой:

$ 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 не сможет выполнить поступившую команду, пользователь получит электронное сообщение, в котором будут указаны причины неудачи.

3.1.3. Опции команды crontab

Общий формат команды crontab таков:

crontab [-u пользователь] – e -l -r


ОПЦИЯ

назначение

-u пользователь

Установка имени пользователя, для которого нужно создать

crontab–файл

-e

Активизация режима редактирования crontab–файла

-1

Отображение содержимого crontab–файла

-r

Удаление crontab–файла

Если вы хотите работать с собственным crontab–файлом, то указывать опцию – и нет необходимости.

3.1.4. Создание crontab–файла

Сначала, еще до того, как crontab–файл будет помещен в очередь заданий программы cron, необходимо установить переменную среды editor. Благодаря этому планировщик получит указание относительно того, какой редактор следует использовать при обработке crontab–файлов. Если вы предпочитаете редактор vi, откройте файл .profile или .bash_profile, находящийся в вашем начальном каталоге, и поместите в него следующие команды:

EDITOR=vi; export EDITOR

Далее создайте новый файл <имя_полъзователя>cron, где <имя_польэователя> – ваше регистрационное имя. Вот пример содержимого такого файла:

   • вывод текущей даты на экран

   • каждые 15 минут между 18:00 и 6:00

0,15,30,45 18-06 * * * /bin/echo 'date' > /dev/console

Приведенная выше запись задает отображение на экране текущей даты каждые 15 минут в указанном интервале времени. Теперь, если система вдруг "зависнет", вы сможете определить, когда это произошло.

Чтобы поместить в очередь заданий планировщика cron свой crontab–файл, выполните команду crontab, указав в ней имя созданного файла:

$ crontab davecron

Копия файла будет помещена в каталог /var/spool/cron, а имя копии совпадет с вашим регистрационным именем (в данном случае – dave).

3.1.5. Вывод на экран содержимого crontab–файла

Для вывода на экран содержимого crontab–файла предназначена команда crontab -l:

$ crontab -l

#(davecron installed on Tue Kay 4 13:07:43 1999)

#вывод текущей даты на экран

#каждые 15 минут между 18:00 и 6:00

0,15,30,45 18-06 * * * /bin/echo "date" > /dev/console

Вот как легко можно создать резервную копию crontab–файла в своем начальном каталоге:

$ crontab -1 > $HOME/davecron

3.1.6. Редактирование crontab–файла

Для добавления, редактирования или удаления записей в crontab–файле используется тот редактор, который указан в переменной среды editor. Чтобы отредактировать файл, выполните команду

$ crontab -e

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

В процессе редактирования crontab–файла можно добавлять в него новые записи. Добавим, например, следующую запись:

   • удаление файлов дампа в 3.30 утра в 1–й, 7–й, 14–й,

   • 21–й и 2б–й день каждого месяца

30 3 1,7,14,21,26 * * /bin/find -name "core" – exec rm {} ;

Желательно размещать перед каждой записью комментарий, объясняющий ее назначение.

Теперь сохраним файл, выйдем из редактора и проверим результат:

$ crontab -1

#(davecron installed on Tue May 4 13:07:43 1999)

#вывод текущей даты на экран

#каждые 15 минут между 18:00 и 6:00

0,15,30,45 18-06 * * * /bin/echo "date" > /dev/console

#удаление файлов дампа в 3.30 утра в 1–й, 7–й, 14–й,

#21–й и 26–й день каждого месяца

30 3 1,7,14,21,26 * * /bin/find -name "core" – exec rm {} ;

3.1.7. Удаление crontab–файла

Для удаления своего crontab–файла введите команду $ crontab -r

3.1.8. Восстановление утерянного crontab–файла

Если crontab–файл случайно удален, инсталлируйте заново исходный файл из вашего начального каталога:

$ crontab <имя_файла>

Именно по этой причине в документации к программе cron говорится о том, что не рекомендуется прибегать к непосредственному редактированию crontab–файла. Следует вносить все изменения в копию файла и инсталлировать ее заново.

3.2. Команда at

Команда at позволяет передавать задания демону cron для одноразового выполнения в назначенное время. Выдавая задание, команда at сохраняет в отдельном файле как его текст, так и все текущие переменные среды. Заметим, что команда crontab не делает этого. По умолчанию все результаты выполнения задания направляются пользователю в виде электронного сообщения.

Как и в случае с программой cron, пользователь root может контролировать, кому разрешено или запрещено выполнять команду at. Соответствующие списки пользователей содержатся в файлах at.allow и at.deny, находящихся в каталоге /etc.

Базовый формат команды at таков:

at [-f файл] [-l -d -m] время


Опция

Назначение

-f файл

Список заданий должен быть взят из указанного файла

-l

Вывод на экран списка заданий, которые ожидают выполнения; аналогична команде atq

-d

Удаление задания с указанным номером; аналогична команде atrm (в некоторых системах заменяется опцией -r)

-m

Выдача пользователю электронного сообщения о завершении задания

время

Спецификация времени, когда будет выполнено задание. Эта спецификация может быть довольно сложной. Допускается указание не только времени в формате часы: минуты, но и даты, а также многочисленных ключевых слов, таких как названия дней недели, месяцы, наречий today (сегодня), tomorrow (завтра), now (сейчас) и др. Наиболее удобна запись вида now + 3 hours (через три часа).

3.2.1. Запуск команд и сценариев с помощью команды at

Текст задания можно передать команде at двумя способами: в файле или в режиме командной строки at. Если задание состоит из одной команды или двух – трех команд, объединенных каналом, то удобнее воспользоваться вторым способом. Для запуска сценариев интерпретатора shell предпочтительнее первый вариант.

В случае необходимости выполнить одиночную команду вызовите команду at, указав требуемое время. Отобразится приглашение at>. Введите свою команду, а затем нажмите [Enter] и [Ctrl+D]. Рассмотрим пример.

$ at 21:10

at> find / -name "passwd" – print

at>

warning: commands will be executed using /bin/sh job 1 at 1999-05-05 21:10

Запись <ЕОТ> появляется после нажатия [Ctrl+D]. Теперь в 21:10 будет выполнена команда find, ищущая в системе файлы с именем passwd. Обратите внимание на то, что команда at присваивает заданию уникальный идентификатор 1. Результаты выполнения команды find будут направлены вам по электронной почте. Вот фрагмент соответствующего электронного сообщения:

Subject: Output from your job 1

/etc/passwd

/etс/pam.d/passwd

/etc/uucp/passwd

/tmp/passwd

/root/passwd

/usr/bin/passwd

/usr/doc/uucp-1.06.1/sample/passwd

Ниже приведены примеры корректного указания времени при вызове команды at:

at 6.45am May 12 – 12–го мая в 6:45 утра

at 11.10pm – в 23:10 (сегодня или завтра, если

это время уже прошло)

at now + 1 hour – через час at 9am tomorrow – завтра в 9:00 утра

at 15:00 May 24 – 24 мая в 15:00 at 4am + 3 days – через 3 дня в 4:00 утра

Если необходимо запустить с помощью команды at файл сценария, укажите его имя после опции -f, как это сделано ниже:

$ at 3.00pm tomorrow -f /apps/bin/db_table.sh

warning: commands will be executed using /bin/sh job 8 at 1999-05-06 15:00

Сценарий db_table.sh будет выполнен завтра в 15:00. Передать задание команде at позволяет также команда echo? $ echo find /etc -name "passwd" – print | at now +1 minute

3.2.2. Просмотр списка запланированных заданий

Для того чтобы просмотреть полный список запланированных заданий, введите команду at -l или atq:

$ atq

   1. 1999-05-05 23:00 а

   2. 1999-05-06 06:00 а

   3. 1999-05-21 11:20 а

В первом столбце содержится идентификатор заданния, за ним следуют дата и время выполнения задания. В последнем столбце находится символ а, указывающий на то, что задание получено от команды at. Существует также команда batch, которая планирует выполнение задания в период наименьшей загруженности системы. Задания, полученные от этой команды, помечаются в выводе команды atq символом b.

Получив задание, команда at создает в каталоге /var/spoot/at файл, в который помещает текст задания и заносит текущие установки всех переменных среды:

$ pwd

/var/spool/at

$ ls

a0000200eb7ae4 a0000400ebd228 a0000800eb7ea4 spool

3.2.3. Удаление запланированного задания

Для удаления задания предназначена команда atrm (синоним команды at -d или at -r), имеющая следующий формат:

atrm номер_задания

Чтобы удалить задание, нужно сначала получить его идентификатор. Поэтому сначала введите команду at -1 и узнайте идентификатор интересующего вас задания, а затем выполните команду atrm:

$ at -l

   1. 1999-05-05 23:00 а

   2. 1999-05-06 06:00 а

   3. 1999-05-21 11:20 а

$ atrm 3

$ at -l

2 1999-05-05 23:00 а

4 1999-05-21 11:20 а

3.3. Оператор &

При выполнении задания в экранном режиме происходит «захват» терминала на весь этот период. Перевод задания в фоновый режим позволяет освободить терминал для других целей. Чтобы выполнить команду в фоновом режиме, укажите после нее оператор &:

команда &

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

Недостаток выполнения команды в фоновом режиме заключается в том, что весь ее вывод по–прежнему направляется на терминал. По этой причине выходные потоки таких команд часто перенаправляют в файл с помощью следующей конструкции:

команда > выходной файл 2>&1 &

Данная конструкция задает переадресацию стандартных потоков вывода и ошибок в указанный файл.

При запуске задания в фоновом режиме на экране отображается номер соответствующего процесса. Впоследствии этот номер можно использовать как для уничтожения процесса с помощью команды kill, так и для перевода задания в экранный режим посредством команды fg.

3.3.1. Запуск команды в фоновом режиме

Выполним в фоновом режиме команду find, которая ищет в каталоге /etc файл srm.conf, и перенаправим ее вывод в файл find .dt

$ find /etc -name "srm.conf" – print > find .dt 2>&1 &

[1] 27015

Номер процесса в данном случае равен 27015. После завершения выполнения задания, когда вы в очередной раз нажмете клавишу [Return], на экране отобразится такое сообщение:

[1]+ Done find /etc "srm.conf" – print

3.3.2. Получение списка выполняющихся процессов с помощью команды ps

Предположим, имеется сценарий psl, который выполняется довольно долго: $ p$1 &

[2] 28305

Узнать о состоянии этого задания можно с помощью команды ps, которая по умолчанию выводит список всех запущенных в данный момент процессов, принадлежащих текущему пользователю:


$ ps

PID

TTY

TIME

CMD

679

pts/0

00:00:01

bash

28305

pts/0

00:02:07

psl

28310

pts/0

00:00:00

ps

Здесь в четырех столбцах приведена следующая информация: первый – идентификатор процесса, второй – идентификатор терминала, с которого он запущен, третий -cуммарное время использования процессора, четвертый – выполняемая команда.

Если процессов слишком много, воспользуйтесь командой grep, указав в ней номер нужного задания:

$ ps | grep 28305

28305 pts/0 00:02:20 psl

Обратите внимание: команда ps не показывает, в каком режиме выполняется задание – в фоновом или экранном.

3.3.3. Уничтожение фонового задания

Сигнал о завершении посылается процессу командой kill:

kill [-сигнал] номер_процесса

Далее в этой книге мы рассмотрим, какие существуют сигналы. Пока же достаточно знать, что по умолчанию команда kill посылает сигнал номер 1 – HUP (hang‑up -oтбой). На экран выводится сообщение о прекращении задания:

$ kill 28305

[1]+ Terminated ./psl

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

$ kill -9 28305

[1] + Killed ./psl

3.4. Команда nohup

Задание, выполняющееся в фоновом режиме, уничтожается, когда запустивший его пользователь выходит из системы. Вы можете обеспечить, чтобы после завершения сеанса работы в системе продолжилось автономное выполнение вашего задания. Для этого запустите его с помощью команды nohup. Общий формат этой команды таков:

nohup команда &

3.4.1. Запуск задания с помощью команды nohup

По умолчанию все выходные данные задания, запушенного с помощью команды nohup, направляются в файл nohup.out, но можно указать другой файл;

nohup команда > выходной файл 2>&1 &

'Давайте проверим работу команды nohup на примере упомянутого выше сценария psl.

$ nohup psl &

[1] 179

nohup; appending output to 'nohup.out'

Теперь выйдите из интерпретатора shell, выполнив команду logout, снова зарегистрируйтесь и введите следующую команду:

$ ps x | grep psl

30004 ? RN 4:01 sh ./psl

30006 pts/1 S 0:00 grep psl

Опция x предназначена для вывода списка заданий, не связанных с терминалом (обратите внимание на знак вопроса во втором столбце). В третьем столбце указан статус задания. Статус R означает, что процесс выполняется, статус N – это признак снижения

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

Если система не поддерживает команду ps x, воспользуйтесь опцией -e, которая предназначена для получения списка всех системных процессов:

$ ps -e | grep psl

30004 ? 00:04:01 sh ./psl

3.4.2. Одновременный запуск нескольких заданий

Если необходимо одновременно выполнить несколько команд, можно объединить их в файле сценария, а затем запустить его с помощью команды nohup. Предположим, имеется следующая цепочка команд:


    Ваша оценка произведения:

Популярные книги за неделю