Top.Mail.Ru

Полезные команды GNU/Linux для разработчика. Часть 1

В этой статье поговорим про команды GNU/Linux, которые удобно использовать разработчику для решения повседневных задач. Подборка ориентирована на тех, кто не хочет залезать глубоко в систему, но по работе вынужден иногда ходить на Linux-сервер. Здесь мы собрали то, чем пользуемся сами и к чему привыкли, однако почти все упомянутые задачи можно решить и другими способами.

Статья написана по мотивам ИТ-посиделки, где мы обменивались полезными лайфхаками. Все команды, которые успели обсудить, мы разделили на две части. В первой поговорим про запросы общей информации о пользователях и системе, работу с файлами, процессами и текстом. Во второй части — о bash и работе с сетью, в частности ssh.

XKCD: 1168

XKCD: 1168

Просмотр информации о системе и пользователях

Полезные команды мы разделили на группы. Начнем с просмотра информации о пользователях и самой операционной системе.

Система

Самая первая команда — информация о пользователе:

id <user>

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

Чтобы посмотреть разнообразную информацию о системе (о пользователях, времени ее работы и т.п.), есть три команды:

who

uptime

w

Последняя — по сути компиляция первых двух. Она позволяет посмотреть, кто и с какого IP-адреса вошел в систему, как давно система была запущена, какова средняя загрузка. Вся эта информация чаще всего нужна применительно к серверам. К примеру, сервер пропадает, а потом внезапно появляется в сети. С помощью этой команды можно узнать, не перезагрузился ли он.

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

last

Если нужны данные по конкретному пользователю, то команде в качестве параметра необходимо передать его username. Это бывает полезно, если возникает подозрение, что кто-то входил в систему несанкционированно.

Память и процессор

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

free

Без параметров она выводит текущую утилизацию памяти в системе — общий объем, размер SWAP, занятое и свободное пространство, буферы и т.п. С параметром -h ту же информацию можно получить в human readable формате, т.е. в мегабайтах и гигабайтах. С параметром -m данные выводятся в мегабайтах.

Следующая команда для получения информации о памяти:

top

Ее вывод — динамический, можно отслеживать потребление памяти в режиме реального времени. Информация обновляется раз в секунду.

Используя шорткаты, можно отсортировать ее вывод:

  • Shift+m — по потреблению памяти;
  • Shift+p — по CPU;
  • 1 — показывает загрузку по ядрам; на современных серверах это будет большая портянка, поскольку там бывает 48 и больше виртуальных ядер, а на мелких виртуалках это очень удобно, особенно при большой сетевой нагрузке (важно знать, как она распределяется, какие ядра заняты).

Выход из утилиты — q.

Существует и улучшенная версия top:

htop

Она динамически рисует загрузку по ядрам в цвете. У нее есть масса настроек, при желании можно пользоваться динамическими фильтрами. Как ими пользоваться, посмотрите в man. Выход из нее — также q или F10.

Есть еще более продвинутый набор утилит:

perf

Это один из самых удобных инструментов отладки и трассировки в Linux. Утилиты помогают смотреть загрузку более детализировано. Можно проваливаться в каждый конкретный процесс, смотреть, какие функции он вызывает и т.п.

Рекомендуем шпаргалку для разработчиков, как пользоваться этим набором утилит: https://firstvds.ru/habrahabr/evans_11.pdf.

Чаще всего наши разработчики используют утилиту, которая отображает потребление ресурсов системы:

perf top

В выводе есть разбивка по процессам, функциям и загруженным в данный момент библиотекам. Например, можно посмотреть, какие функции ClickHouse сейчас работают. Можно посмотреть, чем занимается Java. Если двигать курсором, информация в выводе перестает динамически обновляться — так можно все приостановить и изучить, что же происходит.

С параметром команда выводит более укрупненную информацию:

perf top --sort comm,dso

Данный набор утилит позволяет видеть стектрейсы. С определенными параметрами он запускает трассировку, профилирует, т.е. практически выполняет роль профилировщика. Очень полезная штука.

Диски

Если нужна информация по дискам, наиболее популярна команда:

iotop

Она позволяет посмотреть, какой процесс в данный момент потребляет дисковые ресурсы (с какой скоростью пишет и читает).

Также есть утилита iostat, отображающая загрузку по конкретным блочным устройствам — куда именно идет запись, в каком объеме, каков процент загрузки и утилизации. У нее есть приличное количество параметров. Чаще всего она используется с параметром:

iostat -xk <sec>

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

Работа с процессами

Выше мы уже обсуждали, как посмотреть некоторую информацию по запущенным процессам. Здесь поговорим об этом более детально.

Думаю, что команду ps знают все. Самая популярная комбинация параметров (дефис можно писать или не писать):

ps -axu

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

Иногда нужно посмотреть родительский процесс. Следующая команда позволяет увидеть это на дереве процессов:

pstree

В таком виде команда выводит минимальный объем данных. Но используя один из множества параметров можно вывести process id и прочую дополнительную информацию.

Сигналы

Передавать сигналы процессам позволяет команда:

kill

Несмотря на свое название, она умеет не только “убивать”. В самом простом варианте — без указания номера сигнала — команда корректно останавливает процесс, т.е. процессу уходит сигнал на остановку, он записывает все, что не записал, очищает память и завершает работу.

kill <PID>

Если передать сигнал -9, процесс будет убит, не дожидаясь завершения записи:

kill -9 <PID>

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

kill -1 <PID>

Сигнал -1 позволяет сделать Systemctl reload — перезагрузку сервиса без остановки. При этом переоткрываются файлы журналов, перечитываются конфиги и т.п. В случае nginx все соединения будут закрыты, процессы остановлены и запущены новые — с новой конфигурацией.

А эта команда бывает необходима, когда у вас внезапно порождается куча одинаковых процессов.

killall <CMD>

В качестве параметра ей можно передать имя cmd из вывода команды ps.

Приоритеты

Linux позволяет запускать процессы с различными приоритетами и менять их динамически.

Приоритет — это число от -20 до 19. Чем оно меньше, тем выше приоритет. По умолчанию все процессы запускаются с приоритетом 0. Процессы ядра — функции, которые должны отрабатывать в первую очередь — имеют максимальный приоритет -20. В выводе команды top есть графа ni (т.е. nice), в которой и отображается приоритет процесса.

Запустить процесс с определенным приоритетом можно командой:

nice -n -20..19 <CMD>

Изменить приоритет “на ходу” можно с помощью:

renice -20..19 <PID>

Аналогичная команда есть есть для операций ввода/вывода, в частности записи на диск:

ionice -c<1..3> -n<0..7> <CMD>

Первый параметр — это класс планирования (1 — real time, 2 — best effort, 3 — idle), второй — приоритет внутри класса. Если вы не хотите, чтобы какой-то процесс, например бекап, мешал работе основных систем, с помощью этой команды ему можно задать класс планирования 3. В этом случае запись на диск будет осуществляться, только когда система простаивает и диск вообще не загружен.

Фоновый запуск

В Linux существует более 10 способов запуска команд в фоне. Три самых популярных команды, про которые рассказывают на всех курсах и во всех книжках:

jobs

bg

fg

Здесь подробно на них мы останавливаться не будем, поскольку упомянули только из уважения к их популярности. Рекомендуем посмотреть man. Запуск с nohup позволяет осуществлять запись в файл. Но это не очень удобно, если программа будет ждать от нас ввода каких-то параметров (с текстовыми файлами работать сложнее). Поэтому наши разработчики чаще используют команду

screen

По сути это менеджер текстовых экранов. Команда позволяет запускать процессы в фоне, при этом вывод пишется отдельно и не засоряет экран.

У screen есть много функций. Например, с помощью сочетания Ctrl+a,d можно отцепиться от консольной сессии, оставив в фоне запущенный процесс. Кстати, если вам не нужно плодить множество экранов, а достаточно лишь перехода в фон, можно использовать просто команду

detach

Она запускает процесс в фоне и отцепляет его вывод от консоли. Вернуться можно при помощи той же команды.

Рекомендуем изучить man по screen и detach.

Существуют более современные аналоги screen — mux/dtvm. На Хабре есть неплохая статья по работе с ними — https://habr.com/ru/company/selectel/blog/209130/. Любопытно, что dtvm не умеет делать detach из коробки, поэтому его используют совместно с утилитой dtach.

Тайминги и расписание

Последнее, о чем стоит поговорить в контексте процессов:

time <CMD>

Эта команда позволяет оценить время выполнения команды. Например, можно запустить

time curl https://ya.ru

и узнать, сколько времени шел запрос. Далее (во второй части) мы еще поговорим о расширенном варианте, когда нужно посмотреть, как именно происходит соединение, на каких этапах мы теряем время.

Аналогично можно выяснить, сколько времени выполнялся бекап. Запустили команду с таймингом, ушли заниматься своими делами, вернулись и посмотрели, сколько времени на это ушло.

Для периодического выполнения команд используется

watch

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

watch ls -h

чтобы отслеживать, как растет файл (и прикидывать, когда закончится закачка).

Работа с файлами и директориями

Директории

Начнем с команды вывода текущей директории:

pwd

Очень рекомендуем разработке всегда ее запускать перед тем, как передавать какой-либо команде точку (текущую директорию) в качестве параметра, чтобы случайно не получить тыкву вместо работающей системы.

Создать директорию можно с помощью команды:

mkdir -p /a/b/c/d

При этом если у вас каталог a создан, а b, c и d — нет, они будут созданы по очереди — не придется каждый раз писать mkdir.

Файлы

Вывод списка файлов и директорий (list) — команда:

ls -l

Параметр -l — это длинный вывод. В некоторых дистрибутивах Linux для него есть готовый алиас — ll (про алиасы подробнее поговорим во второй части). Параметр -h отображает размер файлов в human readable формате. Скрытые файлы можно вывести при помощи -la. При использовании параметра -n будут выводиться не имена пользователей, а их айдишники. Это бывает полезно, если нужно посмотреть, кому принадлежат файлы, подключенные к контейнеру (потому что там нужны именно ID пользователя).

Искать файл или библиотеку (а также доки из man) позволяет команда:

whereis <CMD> или <filename>

Например

whereis vi

покажет, что vi находится в директории /usr/bin/vi. Команда бывает полезна при разработке скриптов, работающих не из под рута. Рядовым пользователям обычно доступны не все директории, поэтому в скрипте приходится прописывать полные пути. При помощи команды whereis как раз можно получить этот путь.

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

which

Например для ls (ls — алиас bash, подробнее об этом мы поговорим в следующей части) будет так:

alias ls='ls --color=auto'

/usr/bin/ls

Также искать файлы по именам и куче других параметров (владельцу, времени создания, времени изменения, открытия и т.п.) помогает команда:

find

например, find -size +1000k, -name “test”

Это очень полезная штука. О ней можно говорить долго, но здесь мы подробнее останавливаться не будем — рекомендуем посмотреть man.

У этой команды есть параметр exec, который позволяет находить файлы и выполнять с ними одни и те же действия.

Дисковое пространство

Оценить свободное место на диске и объем, занимаемый директорией, можно с помощью команды disk free:

df -h

Без параметров вы получите информацию в блоках. Размер блока может отличаться, в зависимости от версии операционной системы. На старых Linux блоки были по 512 байт, а если у вас файловая система GPFS и аналоги, df без параметров себя поведет довольно странно.

Параметр -h дает вывод в human readable формате. Параметр -i позволяет посмотреть, сколько занято inodes. Бывает, что места на диске много, но приложение пишет на него очень много мелких файлов и в итоге вы ничего не можете записать, поскольку inodes исчерпаны (по сути, это метаданные файловой системы). Если это так, необходимо что-то придумывать. Для многих файловых систем количество inodes задается при создании, так что вероятно, ее придется пересоздавать.

Утилита disk usage — первый друг и товарищ, когда надо выяснить, куда ушло дисковое пространство.

du .

В таком виде команда позволяет получить размер всех директорий, которые находятся в текущей. Параметр -h выводит список этих директорий и их размер. По du рекомендуем посмотреть man — у этой утилиты очень много полезных параметров, в частности максимальная глубина вложенности и т.п.

К примеру, такая команда позволяет посмотреть списком объем всех директорий внутри var, не проваливаясь внутрь.

du -h --max-depth 1 /var

Кстати, у каждого параметра команд GNU/Linux, вроде max-depth, есть как длинная, так и короткая версии. Указывая два дефиса перед параметром, мы пишем длинную версию, а с одним дефисом — короткую. Использовать можно любой вариант — какой удобнее запомнить.

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

lsof

Она позволяет увидеть, какие процессы в системе держат файлы открытыми. Это бывает полезно, когда нужно размонтировать раздел, но система не дает это сделать.

Для создания файлов нулевой длины используется команда:

touch

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

Сжатие

Архивировать файлы и папки позволяет команда:

tar xzf file.tgz

Tape archiver изначально был создан для ленточных накопителей, но сейчас он применяется гораздо шире. Кстати, он может работать и без сжатия. С помощью tar можно, например запаковать директорию etc перед тем, как производить на сервере или рабочей станции какие-то деструктивные действия.

Наиболее часто используемые параметры:

  • с — запаковать;
  • z — используется zip для сжатия (на современных процессорах лучше себя показывает bzip2; он пакует лучше, но более ресурсоемкий; чтобы его использовать, нужно указать j вместо z);
  • x — распаковать;

В остальном по tar рекомендуем посмотреть man.

Еще один архиватор:

pigz

Это то же самое, что и gzip, но позволяет запаковывать и распаковывать, используя все ядра.

Работа с текстовыми файлами

Начнем с универсального комбайна для работы с текстовыми файлами grep. Команда умеет много всего полезного, например работать с регэкспами разных видов (настраивается из параметров командной строки). У нас чаще всего используются следующие ключи:

  • r — рекурсивный поиск, начиная с указанной директории;
  • v — инверсия поиска, т.е. он выведет все строки, в которые не входит указанное сочетание; этот параметр частенько используется при парсинге логов — можно собрать все ошибки, а потом отфильтровать оттуда 502-е;
  • A NUMB NUM — позволяют вывести все строки до или после найденной соответственно (A = after, B = before). Для этих параметров можно указать количество строк — i;
  • C NUM — работает как оба предыдущих параметра вместе (и до, и после).

Вывод всего содержимого текстового файла в консоль осуществляется командой:

cat

При этом текст остается в консоли.

Есть и другие команды, которые делают по сути то же самое, но чуть иначе.

more

Это постраничный вывод файла в консоль (с пагинацией). Как и в случае с cat, текст остается на экране (его можно будет промотать).

Более продвинутый вариант:

less

Это вывод с возможностью перемотки, поиска и т.п. Например, less используется при выводе справки man. Утилита позволяет проматывать вверх и вниз, искать определенный текст. Синтаксис утилиты похож на vi — через слеш можно набрать нужный текст и будут выведены все совпадения. Клавишей n можно посмотреть следующее.

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

head/tail

По умолчанию (без параметров) выводят по 10 строк файлов: head — первых, tail — последних. У tail есть параметр -f, который удобно использовать для логов. Он будет выводить на экран то, что добавляется в конце файла, пока вы не откажетесь сочетанием Ctrl+C.

Удобно запустить утилиту в консоли и смотреть, что в ней появляется после выполнения команды.

Для поиска отличий двух файлов используется утилита:

diff

Найденные отличия можно сохранить и применить с помощью:

patch

В «до github-вые” времена таким образом разработчики обменивались изменениями по почте. Сейчас эти команды бывают полезны, если надо куда-то перекинуть 10 изменений в разных местах.

Посчитать количество строк в файле можно командой:

wc -l

Частенько эта команда используется на выводе, перенаправленном из других команд. Например, можно сделать grep лога и перенаправить его вывод на команду wc -l (посчитать, сколько раз произошло определенное событие).

Для более глубокой работы с текстом есть редакторы — vi и vim. Про них можно говорить очень долго, поэтому рекомендую обратиться к шпаргалке: https://rigovanov.ru/vim/. Ее удобно распечатать и держать перед глазами.

Для тех, кто так и не освоил магию vim, есть текстовый редактор nano. Он частенько встречается в урезанных дистрибутивах на маршрутизаторах и прочей технике (в отличие от него, vi сейчас разросся и поэтому довольно крупный). Nano сам подсказывает основные действия и удобен, когда нужно быстро отредактировать файл. Некоторые разработчики используют только его, потому что, по их выражению: “Vi умеет только противно пищать и портить текст”.

На сегодня все.

В следующей части поговорим о командах bash, работе с сетью и ssh.

Спасибо за подготовку подборки Игорю Иванову, Антону Дмитриевскому, Денису Палагута, Александру Метелкину и Николаю Еремину (Максилект).

Наши статьи по теме:

Все статьи

Связаться с нами

Мы свяжемся с вами в течение 24 часов.