Научиться управлять стандартными потоками ввода/вывода/ошибок процесса (перенаправление, конвейеры) и управлять выполнением задач в терминале — переключать их между фоновым и приоритетным режимом, останавливать и завершать с помощью сигналов.
У любого процесса в Linux по умолчанию открыты три стандартных потока, у каждого есть числовой дескриптор:
| Поток | Дескриптор | Назначение |
|---|---|---|
stdin |
0 | Стандартный ввод — откуда процесс читает данные |
stdout |
1 | Стандартный вывод — куда процесс пишет обычный результат |
stderr |
2 | Стандартный вывод ошибок — отдельный поток для сообщений об ошибках |
Разделение stdout и stderr на два разных потока — намеренное решение: это позволяет, например, сохранить полезный результат команды в файл, а сообщения об ошибках увидеть отдельно (или отбросить), не путая одно с другим.
| Оператор | Что делает |
|---|---|
> |
Перенаправляет stdout в файл, перезаписывая его содержимое |
>> |
Перенаправляет stdout в файл, дописывая в конец |
2> |
Перенаправляет stderr в файл, перезаписывая его содержимое |
2>> |
Перенаправляет stderr в файл, дописывая в конец |
&> |
Перенаправляет и stdout, и stderr вместе в один файл, перезаписывая |
&>> |
То же самое, но с дозаписью в конец |
\| (конвейер) |
Передаёт stdout одной команды на stdin другой команды |
find — поиск файлов в каталоге по различным критериям (имя, тип, размер, время изменения и др.).less — постраничный просмотр текстовых файлов и вывода команд (в отличие от cat, не выводит всё сразу, а позволяет листать и искать).Когда вы запускаете команду в терминале, она может выполняться в приоритетном (foreground) режиме — занимая терминал, пока не завершится, — либо в фоновом (background) режиме, если добавить в конец команды символ &.
Управление задачами:
jobs — показать список задач, запущенных в текущей сессии терминала (фоновые и приостановленные).fg — вернуть задачу в приоритетный режим (foreground).bg — перевести приостановленную задачу в фоновый режим.Ctrl+Z — приостановить (не завершить!) текущую приоритетную задачу, отправив ей сигнал SIGTSTP.Ctrl+C — прервать выполнение приоритетной задачи, отправив сигнал SIGINT (большинство программ на него завершаются).Ctrl+\ — принудительно завершить задачу сигналом SIGQUIT, с созданием дампа памяти (core dump), если это предусмотрено программой.Разница между «приостановить» и «завершить» — ключевая идея этого раздела: приостановленный процесс не исчезает, он просто перестаёт получать процессорное время, пока его не «разбудят» командой fg/bg.
Каждый шаг, отмеченный значком 📷, требует скриншота терминала с результатом выполнения команды, вставленного в отчёт рядом с соответствующим пунктом. Скриншот должен быть читаемым — не уменьшайте его до нечитаемого размера.
Выполните команду find /run -name 'a*' и изучите её вывод. (Обратите внимание на кавычки вокруг a* — без них шаблон может быть раскрыт самим shell, а не передан команде find.)
📷 Выполните команду find /run -name 'a*' > out и изучите её вывод в терминале. Просмотрите файл out командой less out.
📷 Выполните команду find /run -name 'a*' > out 2> err. Просмотрите файлы out и err (less out и less err).
Запишите в отчёт, для чего предназначены операторы перенаправления > и 2>, опираясь на то, что вы увидели в файлах out и err.
📷 Выполните команду find /run -name 'a*' &> both. Просмотрите файл both. Запишите в отчёт, для чего предназначен оператор &>.
📷 Выполните команду find /run -name 'a*' >> out 2>> err два раза подряд. Просмотрите файлы out и err. Запишите в отчёт, чем >> и 2>> отличаются от > и 2>.
📷 Выполните команду find /run -name 'a*' &>> both два раза подряд. Просмотрите файл both. Запишите в отчёт, для чего предназначен оператор &>>.
📷 Поочерёдно выполните команды dmesg | less и просто dmesg (без less; если система запросит права — используйте sudo dmesg | less). Чтобы выйти из less, нажмите Q. Запишите в отчёт, что изменилось в поведении команды при добавлении | less.
Изучите статью об утилитах обработки текста (habr.com/ru/companies/itsumma/articles/492932) и законспектируйте в отчёт своими словами, для чего используется каждая упомянутая утилита (без копирования текста статьи).
📷 Проверьте список текущих задач (jobs). Запустите ping ya.ru, подождите несколько секунд и приостановите её, нажав Ctrl+Z. Проверьте список задач ещё раз (jobs).
📷 Вернитесь к приостановленной задаче командой fg, подождите несколько секунд и прервите её работу клавишами Ctrl+C. Проверьте список задач ещё раз (jobs).
Проверьте, как на работу команды ping ya.ru влияет нажатие Ctrl+\.
Опишите в отчёте, что делают клавиши Ctrl+Z, Ctrl+C, Ctrl+\, а также команды jobs и fg — в терминах сигналов, которые они отправляют процессу.
📷 Запустите команду ping ya.ru &. Проверьте поведение клавиш Ctrl+Z, Ctrl+C и Ctrl+\ в этом режиме. Проверьте команду jobs прямо во время работы ping. Проверьте команду fg прямо во время работы ping, а затем прервите её работу клавишами Ctrl+C.
Опишите в отчёте действие суффикса & и объясните, почему поведение горячих клавиш в пункте 14 отличалось (или не отличалось) от пунктов 10–12.
Изучите дополнительно и кратко законспектируйте своими словами:
stdout и stderr), а не один общий?> и >>? А 2> и 2>>?command > file 2> file (перенаправить оба потока в один и тот же файл через два отдельных оператора) — почему это не то же самое, что &>?Ctrl+Z, а какой — Ctrl+C? В чём принципиальная разница их действия на процесс?stopped) задача отличается от завершённой?jobs, если задача была запущена с суффиксом &, а что — если без него (сразу после запуска, пока команда работает)?dmesg использование | less удобнее, чем вывод команды без пайпа?