Linux и UNIX: программирование в shell. Руководство разработчика. - страница 18
Теперь выйдите из интерпретатора 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. Предположим, имеется следующая цепочка команд:
>cat /home/acccmnts/qtr_04 99 | /apps/bm/trials.awk | sort | lp
Поместим ее в файл:
>$ cat > quarterend
>cat /home/accounts/qtr_0499 | /apps/bin/trials.awk | sort | lp
Сделаем файл исполняемым:
>$ chmod 744 quarterend
Теперь запустим этот файл в фоновом режиме посредством команды nohup, направив результаты работы сценария в файл qtr.out.
>$ nohup ./quarterend > qtr.out 2>&l &
>[5] 182
Обратите внимание на то, что при вызове файла quarterend указано путевое имя '. /.' Тем самым интерпретатору shell дается указание искать данную команду в текущем каталоге.
3.5. Заключение
Мы рассмотрели различные способы выполнения заданий в фоновом режиме. Необходимость в этом может возникнуть при пакетном обновлении больших файлов или выполнении сложной операции поиска. Подобную работу лучше не делать в часы пиковой загрузки системы.
Можно создать сценарии, которые автоматически модифицируют журнальные файлы. Вам останется лишь просматривать эти файлы по мере необходимости. Таким образом, программа cron и другие представленные в этой главе команды позволяют существенно упростить администрирование системы.
ГЛАВА 4
Подстановка имен файлов
При работе в режиме командной строки довольно много времени уходит на поиск необходимых файлов. Интерпретатор shell предлагает набор метасимволов, позволяющих находить файлы, имена которых соответствуют предложенному шаблону.
Вот список основных метасимволов:
* Соответствует произвольной строке, содержащей ноль и более символов
? Соответствует любому символу
[…] Соответствует любому символу из числа заключенных в скобки
[!…] Соответствует любому символу за исключением тех, которые указаны в скобках
Когда интерпретатор shell встречает указанные символы в командной строке, он обрабатывает их особым образом, если только вы не защитили их с помощью кавычек, о чем говорится в главе 15.
4.1. Применение метасимвола '*'
Символ звездочки может служить заменой любой части имени файла. Следующая команда выводит список всех файлов, имена которых начинаются со строки "app":
>$ ls app*
>appdva app_tapes
>appdva_SLA
Вот как можно получить список файлов, имеющих расширение doc:
>$ ls *.doc
>accounts.doc qtr_end.doc
Представленная ниже команда находит файлы, у которых имя начинается со строки "cl", а расширение равно sed:
$ ls cl*.sed
>cleanlogs.sed cleanmeup.sed
>cleanmessages.sed
Звездочку удобно применять, когда, например, не хочется вводить полное имя каталога при переходе в него:
>$ cd /etc
>$ ls -l | grep ^d
>drwxr‑xr‑x 2 root root 1024 Jan 26 14:41 cron.daily
>drwxr‑xr‑x 2 root root 1024 Jan 27 1998 cron.hourly
>drwxr‑xr‑x 2 root root 1024 Jan 27 1998 cron.monthly
>drwxr‑xr‑x 2 root root 1024 Jan 26 14:37 cron.weekly
>$ cd cron.w* S pwd
>/etc/cron.weekly
4.2. Применение метасимвола '?'
Знак вопроса служит для замены любого отдельного символа. Следующая команда выводит список файлов, имена которых содержат не менее трех символов, причем третьим является символ 'R':
>$ ls ??R*
>BAREAD
Следующая команда ищет файлы с именами, начинающимися со строки "conf", за которой следуют два произвольных символа и расширение log: