Практическая работа 4. Работа с потоками ввода-вывода и фоновыми задачами

Цель работы

Научиться управлять стандартными потоками ввода/вывода/ошибок процесса (перенаправление, конвейеры) и управлять выполнением задач в терминале — переключать их между фоновым и приоритетным режимом, останавливать и завершать с помощью сигналов.

Теория

Стандартные потоки процесса

У любого процесса в Linux по умолчанию открыты три стандартных потока, у каждого есть числовой дескриптор:

Поток Дескриптор Назначение
stdin 0 Стандартный ввод — откуда процесс читает данные
stdout 1 Стандартный вывод — куда процесс пишет обычный результат
stderr 2 Стандартный вывод ошибок — отдельный поток для сообщений об ошибках

Разделение stdout и stderr на два разных потока — намеренное решение: это позволяет, например, сохранить полезный результат команды в файл, а сообщения об ошибках увидеть отдельно (или отбросить), не путая одно с другим.

Операторы перенаправления

Оператор Что делает
> Перенаправляет stdout в файл, перезаписывая его содержимое
>> Перенаправляет stdout в файл, дописывая в конец
2> Перенаправляет stderr в файл, перезаписывая его содержимое
2>> Перенаправляет stderr в файл, дописывая в конец
&> Перенаправляет и stdout, и stderr вместе в один файл, перезаписывая
&>> То же самое, но с дозаписью в конец
\| (конвейер) Передаёт stdout одной команды на stdin другой команды

Утилиты, используемые в работе

  • find — поиск файлов в каталоге по различным критериям (имя, тип, размер, время изменения и др.).
  • less — постраничный просмотр текстовых файлов и вывода команд (в отличие от cat, не выводит всё сразу, а позволяет листать и искать).

Задачи и управление ими в shell

Когда вы запускаете команду в терминале, она может выполняться в приоритетном (foreground) режиме — занимая терминал, пока не завершится, — либо в фоновом (background) режиме, если добавить в конец команды символ &.

Управление задачами:

  • jobs — показать список задач, запущенных в текущей сессии терминала (фоновые и приостановленные).
  • fg — вернуть задачу в приоритетный режим (foreground).
  • bg — перевести приостановленную задачу в фоновый режим.
  • Ctrl+Z — приостановить (не завершить!) текущую приоритетную задачу, отправив ей сигнал SIGTSTP.
  • Ctrl+C — прервать выполнение приоритетной задачи, отправив сигнал SIGINT (большинство программ на него завершаются).
  • Ctrl+\ — принудительно завершить задачу сигналом SIGQUIT, с созданием дампа памяти (core dump), если это предусмотрено программой.

Разница между «приостановить» и «завершить» — ключевая идея этого раздела: приостановленный процесс не исчезает, он просто перестаёт получать процессорное время, пока его не «разбудят» командой fg/bg.

Подготовка

  1. Получите у преподавателя данные для подключения: адрес сервера, имя пользователя, закрытый ключ.
  2. Подключитесь к серверу по SSH.
  3. Создайте отчет в виде в виде doc-файла.

Ход работы

Каждый шаг, отмеченный значком 📷, требует скриншота терминала с результатом выполнения команды, вставленного в отчёт рядом с соответствующим пунктом. Скриншот должен быть читаемым — не уменьшайте его до нечитаемого размера.

  1. Выполните команду find /run -name 'a*' и изучите её вывод. (Обратите внимание на кавычки вокруг a* — без них шаблон может быть раскрыт самим shell, а не передан команде find.)

  2. 📷 Выполните команду find /run -name 'a*' > out и изучите её вывод в терминале. Просмотрите файл out командой less out.

  3. 📷 Выполните команду find /run -name 'a*' > out 2> err. Просмотрите файлы out и err (less out и less err).

  4. Запишите в отчёт, для чего предназначены операторы перенаправления > и 2>, опираясь на то, что вы увидели в файлах out и err.

  5. 📷 Выполните команду find /run -name 'a*' &> both. Просмотрите файл both. Запишите в отчёт, для чего предназначен оператор &>.

  6. 📷 Выполните команду find /run -name 'a*' >> out 2>> err два раза подряд. Просмотрите файлы out и err. Запишите в отчёт, чем >> и 2>> отличаются от > и 2>.

  7. 📷 Выполните команду find /run -name 'a*' &>> both два раза подряд. Просмотрите файл both. Запишите в отчёт, для чего предназначен оператор &>>.

  8. 📷 Поочерёдно выполните команды dmesg | less и просто dmesg (без less; если система запросит права — используйте sudo dmesg | less). Чтобы выйти из less, нажмите Q. Запишите в отчёт, что изменилось в поведении команды при добавлении | less.

  9. Изучите статью об утилитах обработки текста (habr.com/ru/companies/itsumma/articles/492932) и законспектируйте в отчёт своими словами, для чего используется каждая упомянутая утилита (без копирования текста статьи).

  10. 📷 Проверьте список текущих задач (jobs). Запустите ping ya.ru, подождите несколько секунд и приостановите её, нажав Ctrl+Z. Проверьте список задач ещё раз (jobs).

  11. 📷 Вернитесь к приостановленной задаче командой fg, подождите несколько секунд и прервите её работу клавишами Ctrl+C. Проверьте список задач ещё раз (jobs).

  12. Проверьте, как на работу команды ping ya.ru влияет нажатие Ctrl+\.

  13. Опишите в отчёте, что делают клавиши Ctrl+Z, Ctrl+C, Ctrl+\, а также команды jobs и fg — в терминах сигналов, которые они отправляют процессу.

  14. 📷 Запустите команду ping ya.ru &. Проверьте поведение клавиш Ctrl+Z, Ctrl+C и Ctrl+\ в этом режиме. Проверьте команду jobs прямо во время работы ping. Проверьте команду fg прямо во время работы ping, а затем прервите её работу клавишами Ctrl+C.

  15. Опишите в отчёте действие суффикса & и объясните, почему поведение горячих клавиш в пункте 14 отличалось (или не отличалось) от пунктов 10–12.

Дополнительные задания (по желанию)

Изучите дополнительно и кратко законспектируйте своими словами:

  1. habr.com/ru/companies/ruvds/articles/339820
  2. habr.com/ru/companies/ruvds/articles/336060
  3. habr.com/ru/companies/lanit/articles/683638

Контрольные вопросы

  1. Почему у процесса есть два разных потока для вывода (stdout и stderr), а не один общий?
  2. Чем отличаются > и >>? А 2> и 2>>?
  3. Что произойдёт, если выполнить command > file 2> file (перенаправить оба потока в один и тот же файл через два отдельных оператора) — почему это не то же самое, что &>?
  4. Какой сигнал отправляет Ctrl+Z, а какой — Ctrl+C? В чём принципиальная разница их действия на процесс?
  5. Чем приостановленная (stopped) задача отличается от завершённой?
  6. Что покажет jobs, если задача была запущена с суффиксом &, а что — если без него (сразу после запуска, пока команда работает)?
  7. Почему для просмотра длинного вывода dmesg использование | less удобнее, чем вывод команды без пайпа?