Терминал, командная строка, обработка текста и диагностика
Вячеслав Федоров
Лекция 2
Разработка и применение ПО
в физических исследованиях
|
Содержание
От рабочего места до поиска неисправностей
01
Рабочее место
02
Командная строка
03
Полезные утилиты
04
Редактирование
05
Обработка текста
06
Диагностика
Цель лекции
Командная строка как основной интерфейс к системе
Скорость повседневной работы определяется тем, какая доля действий выполняется командами, а не вручную: копирование файлов, просмотр журналов и обработка результатов расчётов укладываются в одну строку.
Рабочее место
Печать, терминал, шрифт и оболочка
01
Рабочее место
Командная строка
Утилиты
Редакторы
Обработка текста
Диагностика
Слепая
печать
01
Скорость набора растёт
02
Ошибок становится меньше
03
Внимание остаётся на экране, а не на клавиатуре
Важно
В первые месяцы после переучивания скорость набора временно снижается.
GNU Typist
консольный тренажёр; уроки и собственные тексты
apt install gtypist
monkeytype.com, keybr.com
онлайн-тренажёры, в том числе на текстах программ со скобками и знаками препинания
Эмулятор
терминала
Стандартный терминал, как правило, только отображает текст. Полноценный эмулятор дополнительно поддерживает:
01
вкладки и разделение окна на панели
02
копирование выделением
03
ссылки, открывающиеся по щелчку
04
плагины, темы, прозрачность
Система
Эмулятор
macOS
iTerm2
Linux
Terminator, Kitty, Konsole
Windows 10/11
Windows Terminal
Windows
MobaXterm (условно бесплатный; SSH, X-сервер)
Моноширинные
шрифты
Source Code Pro
0O o 1lI
{}[]() ;:
E = mc^2; x[i] = 0
Inconsolata
0O o 1lI
{}[]() ;:
E = mc^2; x[i] = 0
JetBrains Mono
0O o 1lI
{}[]() ;:
E = mc^2; x[i] = 0
Все символы имеют одинаковую ширину: колонки вывода не смещаются, а ноль и буква O, единица и строчная l различимы. К этой группе относится и Anonymous Pro; сравнение шрифтов приведено на programmingfonts.org.
Терминал и
оболочка
Клавиатура и экран
Эмулятор терминала
Псевдотерминал /dev/pts/N
Оболочка bash
Программа ls, grep…
Пояснение
Терминал только отображает символы и передаёт нажатия клавиш. Строку разбирает и выполняет оболочка; приглашение root@lab:~# тоже выводит она.
Для физика
Команды одинаково работают в любом терминале: на ноутбуке, по ssh на кластере и в окне tmux.
Командные
оболочки
01
bash
есть почти на любой машине, доступной по ssh; переносимые скрипты пишутся под него
02
zsh
развитое дополнение и плагины, фреймворк Oh My Zsh; оболочка по умолчанию в macOS
03
fish
подсказки и подсветка без настройки; синтаксис несовместим с POSIX sh
Пояснение
Выбор оболочки: при работе со многими удалёнными серверами — bash, на собственной рабочей машине — zsh или fish; скрипты пишутся для bash или POSIX sh.
Демонстрация:
оболочка
01
Оболочка текущего сеанса
02
Процесс оболочки: ps -p $$
03
Допустимые оболочки: /etc/shells
04
Псевдотерминал и тип терминала
Что наблюдается
Сеанс обслуживает bash на псевдотерминале /dev/pts/N; в /etc/shells рядом с bash и dash перечислены screen и tmux.
root@lab — запись со стенда
Командная строка
Поиск команд, справка, процессы и потоки
02
Рабочее место
Командная строка
Утилиты
Редакторы
Обработка текста
Диагностика
Поиск и запуск
команды
ls -l /etc
Разбор: argv = ls, -l, /etc
Проверка встроенных: cd, [, echo
Поиск по $PATH слева направо
execve /usr/bin/ls
Расположение команды:
type cd ls [
which -a python3
which находит только файлы, type — также встроенные команды.
Флаг
Обычное значение
-h, --help
краткая справка
-v, --version
версия или подробный вывод
-y, -f
без подтверждения
--
конец флагов, далее аргументы
Демонстрация:
поиск команд
01
Каталоги поиска: $PATH
02
Тип команд cd, ls и [
03
Все копии [ в $PATH
04
Исполняемый файл /usr/bin/[
05
Аргументы процесса cron в /proc
Что наблюдается
cd и [ — встроенные команды bash, хотя файл /usr/bin/[ существует; командная строка процесса хранится в /proc/PID/cmdline.
root@lab — запись со стенда
Справка
man
Раздел
Содержание
1
команды пользователя
2
системные вызовы
3
функции библиотек
5
форматы файлов: fstab, passwd
7
обзоры: signal, regex
8
администрирование
Внутри man (пейджер less):
Клавиша
Действие
/слово
поиск
n, N
следующее, предыдущее
g, G
начало, конец
q
выход
man 7 signal
MANPAGER=cat man ls
Демонстрация:
справка man
01
Краткие описания: whatis
02
Поиск по описаниям: man -k
03
Обзор сигналов: man 7 signal
04
Поиск в less: /Standard signals
05
Выход: q
Что наблюдается
whatis и man -k показывают номер раздела рядом с именем; поиск в less переносит прямо к таблице стандартных сигналов.
root@lab — запись со стенда
Редактирование
строки
Клавиши
Действие
Ctrl+A, Ctrl+E
в начало, в конец строки
Alt+B, Alt+F
на слово назад, вперёд
Ctrl+W
удаление слова слева
Ctrl+U, Ctrl+K
удаление до начала, до конца
Ctrl+Y
вставка удалённого
Ctrl+L
очистка экрана
Пояснение
Alt называется Meta: на macOS это Option, который в настройках терминала включается как Meta.
Для физика
Длинная команда запуска расчёта правится в строке, а не набирается заново.
Сигналы и
задания
Клавиши
Что происходит
Ctrl+C
SIGINT: прерывание
Ctrl+\
SIGQUIT: завершение с дампом памяти
Ctrl+Z
SIGTSTP: приостановка
Ctrl+D
не сигнал: конец ввода (EOF)
На переднем плане
Ctrl+Z
Остановлено
bg — продолжение в фоне, fg — возврат
В фоне
jobs — список заданий; fg %1, bg %1, kill %1 — по номеру; stty -a — назначение клавиш.
Демонстрация:
задания
01
Клавиши терминала: stty -a
02
Запуск sleep 300
03
Ctrl+Z: остановка задания
04
jobs и bg: работа в фоне
05
fg и Ctrl+C: прерывание задания
Что наблюдается
Остановленное задание не завершено: после bg оно работает в фоне, после fg снова получает терминал и прерывается по Ctrl+C.
root@lab — запись со стенда
Потоки
ввода-вывода
0 · stdin
1 · stdout
2 · stderr
cat file
stdout
Канал: буфер в памяти ядра
stdin
grep err
Пояснение
Конвейер передаёт только stdout: сообщения об ошибках выводятся на экран, минуя фильтр. |& передаёт оба потока.
Перенаправление
вывода
Запись
Смысл
cmd > f
stdout в файл с перезаписью
cmd >> f
stdout в конец файла
cmd 2> f
stderr в файл
cmd &> f
оба потока в файл
cmd > f 2>&1
оба потока в файл
cmd < f
stdin из файла
Важно
Порядок перенаправлений существен: в cmd 2>&1 > f в файл попадёт только stdout, а ошибки останутся на экране.
Специальные файлы:
/dev/null — поглощает запись
/dev/zero — нули
/dev/urandom — случайные байты
Для физика
Долгий расчёт: ./sim > result.dat 2> errors.log — ошибки собираются в отдельном файле и не теряются среди выходных данных.
Демонстрация:
перенаправление
01
Вывод и ошибки в разные файлы
02
Строки в файле и текст ошибки
03
Оба потока в конвейер
04
Порядок: 2>&1 > /dev/null
05
16 случайных байт
06
Файл из нулей: dd
Что наблюдается
При 2>&1 > /dev/null в /dev/null направляется только stdout, а ошибка остаётся на экране: перенаправления применяются слева направо.
root@lab — запись со стенда
Дополнение и
история
Tab
одно нажатие дополняет команду, файл, флаг;
два — показывают варианты;
правила дополнения устанавливаются пакетом bash-completion.
История ~/.bash_history
Ctrl+R — поиск по подстроке, повторное нажатие — более раннее совпадение;
!! — предыдущая команда, sudo !! — она же с sudo;
!$ — последний аргумент предыдущей команды;
history | grep слово.
Пояснение
Команда с пробелом в начале не попадает в историю (в .bashrc Ubuntu задано HISTCONTROL=ignoreboth); history -a сразу дописывает историю в файл.
Демонстрация:
история
01
Команда с аргументом /var/log
02
!$ — последний аргумент
03
Последние записи истории
04
Ctrl+R: поиск по подстроке
Что наблюдается
bash показывает развёрнутую команду перед выполнением; Ctrl+R находит команду по подстроке в любом месте строки.
root@lab — запись со стенда
Циклы, условия,
подоболочки
for i in $(seq 1 10); do ./sim --seed $i > run$i.dat; done
du -sh /var/* | while read size path; do …; done
if [ "$(wc -l < f.txt)" -gt 3 ]; then …; fi
(cd /tmp; …) — подоболочка
x=$(date +%s) — подстановка вывода
Пояснение
[ — это команда (встроенная и /usr/bin/[), поэтому пробелы вокруг скобок обязательны.
Для физика
Серия из ста расчётов с параметрами из файла запускается циклом в одну строку. Скрипт длиннее двух-трёх десятков строк целесообразно переписать на Python.
Демонстрация:
циклы
01
Цикл for по seq
02
Самые большие каталоги /var
03
while read: разбор вывода
04
Смена каталога в подоболочке
05
Подоболочка и переменные родителя
06
Условие через [
Что наблюдается
cd и присваивания внутри ( ) не влияют на родительскую оболочку; [ -d /etc ] возвращает код 0, и && выполняет вторую команду.
root@lab — запись со стенда
Полезные утилиты
Поиск файлов, параллельный запуск, сессии
03
Рабочее место
Командная строка
Утилиты
Редакторы
Обработка текста
Диагностика
Поиск файлов:
find
find <где> <условия> <действие>
Условие
Значение
-name '*.dat'
имя по шаблону
-type f / -type d
файл / каталог
-size +100M
больше 100 МиБ
-mtime -1
изменён за сутки
-exec cmd {} +
запуск команды для найденных файлов
-print0
имена через нулевой байт
Для физика
find ~/runs -name '*.root' -mtime -1 — выходные файлы расчётов за последние сутки.
Важно
-delete удаляет найденное без подтверждения, поэтому команда сначала выполняется без него.
xargs и
параллельный запуск
find … -print0
xargs -0 -P4 -n1 md5sum
md5sum файл1
md5sum файл2
md5sum файл3
md5sum файл4
Флаг
Значение
-n N
до N аргументов на запуск
-P N
N процессов одновременно; 0 — без ограничения
-0
имена через нулевой байт
-I{}
подстановка строки на место {}
Пояснение
Выигрыш ограничен числом ядер (nproc) и скоростью диска. GNU parallel дополнительно сохраняет порядок вывода, ведёт журнал заданий и запускает задания по ssh.
Демонстрация:
find и xargs
01
Файлы *.conf в /etc
02
Число найденных файлов
03
Пять sleep подряд: 0+1+2+3+4 = 10 с
04
Те же sleep параллельно: 4 с
Что наблюдается
Последовательный запуск длится сумму времён, параллельный — время самого долгого задания.
root@lab — запись со стенда
Сессии:
tmux и screen
Действие
tmux
screen
новая сессия
tmux new -s calc
screen -S calc
отключение
Ctrl+B, D
Ctrl+A, D
список сессий
tmux ls
screen -ls
подключение
tmux a -t calc
screen -r calc
разделение окна
Ctrl+B, % или "
Ctrl+A, S или |
Для физика
Расчёт на кластере запускается внутри tmux: обрыв ssh его не прерывает, а к сессии можно позднее подключиться с другой машины.
Пояснение
watch -d -n1 'wc -l result.dat' в соседней панели показывает, как растёт файл результатов.
Демонстрация:
tmux
01
Сессия calc с watch в фоне
02
Список сессий: tmux ls
03
Экран сессии без подключения
04
Завершение сессии
Что наблюдается
Сессия работает без подключённого терминала: capture-pane показывает экран watch, который обновляется каждую секунду.
root@lab — запись со стенда
Редактирование
Консольные редакторы: vim, vimdiff, vimtutor
04
Рабочее место
Командная строка
Утилиты
Редакторы
Обработка текста
Диагностика
Режимы
vim
Вставка
Нормальный
Визуальный
Командная строка
i, a, o — вход Esc — выход
v, V — вход Esc — выход
«:» — вход Enter, Esc — выход
Клавиши
Действие
i, a, o
вставка перед курсором, после, с новой строки
Esc
возврат в нормальный режим
:w, :q
сохранение, выход
:wq, :q!
сохранение с выходом; выход без сохранения
/слово, n
поиск и следующее совпадение
u, Ctrl+R
отмена, повтор
dd, yy, p
удаление строки, копирование, вставка
:%s/a/b/g
замена a на b во всём файле
Освоение
vim
01
vimtutor
встроенный учебник: около 30 минут упражнений в терминале
02
vimdiff file1 file2
сравнение двух файлов в соседних окнах с подсветкой различий
B. Gregg, 2-е изд., 2020: справочник по всему, что в Linux измеримо.
Демонстрация:
ресурсы машины
01
Ядра и процессор: nproc, lscpu
02
Память: free -h
03
Место на дисках: df -h
04
Средняя загрузка: uptime
05
Процессор и память во времени: vmstat
06
Ввод-вывод по устройствам: iostat
Что наблюдается
У lab 2 ядра и 3,8 ГиБ памяти, корень заполнен на 35 %; столбец id в vmstat близок к 100 — система простаивает.
root@lab — запись со стенда
Процессор и
память
Показатель
Где
Что означает
load average
uptime, top
готовые к выполнению и ждущие диска задачи за 1, 5, 15 мин
us, sy, wa
top, vmstat
время процессора: программы, ядро, ожидание ввода-вывода
%CPU
top, ps
100 % — одно ядро целиком
available
free -h
память, доступная без вытеснения
si, so
vmstat
обмен со swap: признак нехватки памяти
Пояснение
Внутри top: 1 — по ядрам, P и M — сортировка по процессору и памяти, c — полная команда, d — интервал обновления.
Для физика
Расчёт в 4 потока: у процесса 400 %, а строка %Cpu(s) на 32-ядерной машине покажет около 12 %.
Демонстрация:
top и htop
01
Снимок top в пакетном режиме
02
htop: загрузка по ядрам и память
03
Выход из htop: q
Что наблюдается
Верхние строки top повторяют uptime и free; htop показывает каждое ядро отдельной полосой.
root@lab — запись со стенда
Диск и
сеть
Команда
Показывает
df -h
место по файловым системам
df -ih
занятые иноды
du -sh /var/log/*
размер каталогов
iostat -x 1
загрузку дисков (%util)
lsof +L1
удалённые, но открытые файлы
Команда
Показывает
ping -c 3 host
связность и задержку
mtr -T -P 443 host
маршрут и потери
ss -tlnp
слушающие порты
ss -s
сводку по сокетам
ethtool eth0
скорость и параметры интерфейса
tcpdump -nn host X
пакеты с узлом X
Важно
Свободное место исчерпано, а du не находит занятого: файл удалён, но ещё открыт процессом. lsof +L1 показывает такие файлы; место освобождается после их закрытия.
Демонстрация:
сеть
01
ping до шлюза виртуальной сети
02
mtr по TCP на порт 443
03
tcpdump: рукопожатие TCP при запросе curl
Что наблюдается
Видны три пакета рукопожатия [S], [S.], [.], затем клиент отправляет 517 байт — приветствие TLS (ClientHello).
root@lab — запись со стенда
Трассировка:
strace и lsof
strace
strace -c cmd
сводка системных вызовов
strace -e trace=openat cmd
открываемые файлы
strace -fp PID
подключение к процессу, -f — все потоки
lsof
lsof -p PID
файлы и сокеты процесса
lsof -i :22
процесс, открывший порт
lsof +L1
удалённые, но открытые файлы
Ядро
dmesg -T
сообщения ядра с датой и временем
journalctl -k
те же сообщения из журнала systemd
sysctl -a | grep name
параметры ядра
Важно
strace останавливает процесс на каждом системном вызове и замедляет его в несколько раз.
Для физика
Программа не находит конфигурацию и не сообщает об этом: strace -e trace=openat показывает все пути, по которым она ищет файл.
Демонстрация:
strace, ss и lsof
01
Сводка системных вызовов ls
02
Файлы, открываемые cat
03
Слушающие порты: ss -tlnp
04
Владелец порта 22: lsof
Что наблюдается
ls выполняет около 150 системных вызовов; порт 22 открыт процессом systemd, так как в Ubuntu 24.04 ssh запускается по сокету.
root@lab — запись со стенда
Профилирование:
perf
01
perf top -F 99
профиль системы в реальном времени: функции, занимающие процессор
02
perf record -e cpu-clock -g -- cmd
запись выборок со стеками вызовов в perf.data
03
perf report
отчёт по функциям: [k] — ядро, [.] — пользовательский код
apt install linux-tools-$(uname -r)
Важно
В виртуальной машине аппаратных счётчиков обычно нет: событие cycles недоступно, используется программное cpu-clock.
Пояснение
Без отладочных символов вместо имён функций видны адреса; имена восстанавливаются установкой пакетов -dbgsym или сборкой с -g.
curl
из командной строки
curl -sI URL
только заголовки ответа
curl -v URL
весь обмен, включая установку TLS
curl -s -o /dev/null -w '%{http_code}\n' URL
только код ответа
curl -H 'Accept: application/json' URL
дополнительный заголовок запроса
curl -X POST -d @body.json URL
запрос с телом из файла
Пояснение
-w выводит переменные измерений запроса: код ответа, размеры, времена этапов. Их список — в man curl, раздел --write-out.
Важно
Запросы в цикле к стороннему сервису выполняются с паузой, иначе они создают на него заметную нагрузку.
Демонстрация:
curl
01
Заголовки ответа: curl -sI
02
Код ответа и полное время: -w
Что наблюдается
Сайт книги отвечает HTTP/2 200 за 0,37 с; времена отдельных этапов запроса выводятся той же опцией -w.
root@lab — запись со стенда
Заключение
01
Слепая печать и полноценный эмулятор терминала повышают скорость всей последующей работы.
02
Справка man описывает именно установленную версию команды; к ней обращаются раньше, чем к поисковой системе.
03
Долгие расчёты запускаются в tmux: обрыв связи их не прерывает.
04
grep, sed, awk и sort в конвейере заменяют разовую программу; повторяемая обработка переносится на Python.
05
Диагностика выполняется сверху вниз по подсистемам, и каждое предположение подтверждается измерением.
Мерилом является не число выученных команд, а число действий, выполняемых одной строкой вместо ручной работы.
Домашнее задание
Настройка рабочего места
01
Эмулятор терминала и одна фраза, объясняющая выбор
02
PS1 вида login@your-login-at-nsu: тремя цветами
03
asciinema для записи скринкастов
Практика: запись в asciinema
01
gtypist, упражнение S3
02
The Command Line Murders
03
Машина с Ubuntu по ssh: ядра, память, диск, IOPS, сеть
04
Однострочник на curl, раз в секунду
05
perf record и perf report; (*) zstd с отладочными символами
Требования к сдаче
На записи виден результат, а не только набор команды
gtypist: Raw speed, Adjusted speed и процент ошибок
curl: несколько строк вывода со всеми шестью полями
Мониторинг: ответы на все пять вопросов
(*) запись perf report и имя самой нагруженной функции с файлом исходников