Назад
63

Полезные Linux-команды

63

Введение

В этой статье мы расскажем о нескольких Linux-командах — они позволят сильно упростить работу любого Data Scientist’а. Рассмотрим распространенные задачи, которые могут перед нами возникнуть, и решим их вместе 🙂

Работа с выделенным сервером

Обычно мы обучаем модели не на своем железе, а на выделенном сервере. К нему мы можем подключиться через ssh.

Одна из проблем такого подключения — при закрытии ssh-соединения наш сеанс на сервере прерывается. Следовательно, если мы подключимся и запустим какую-нибудь команду (например, python train_model.py), то после закрытия соединения программа перестанет выполняться.

Как этого можно избежать?

Screen и Tmux

Screen — это команда для запуска новой виртуальной сессии, которая будет выполняться на заднем фоне.

Для этого нам достаточно обратиться к команде screen -s name (имя сессии можно не указывать): у нас появится новая сессия, где можно запустить команду. После этого мы отключимся, но команда продолжит выполняться.

Если мы подключимся обратно — сможем вернуться на эту сессию с помощью screen -r name. При запуске одной виртуальной сессии необязательно указывать ее имя. Увидеть список всех сессий можно через screen -ls. А отсоединиться от запущенной сессии — через CTRL+A и затем D.

Есть и другая команда — Tmux. Она работает идентично Screen.

Ниже представлена таблица соответствия команд для Screen и Tmux:

ФункцияScreenTmux
Начать новую сессию с именем session_namescreen -S session_nametmux new -t session_name
Подключиться к сессии с идентификатором process_id или с именем session_namescreen -r process_id/session_nametmux a -t process_id/session_name
Переименовать сессиюCtrl+a :sessionname session_nameCtrl+b $
Отсоединиться от сессииCtrl+a dCtrl+b d

Для обеих команд можно изменить escape комбинацию клавиш. Как это сделать? Для Tmux нужно создать файл ~/.tmux.conf и добавить туда строчку set-option -g prefix <новый_символ>, а для Screen — создать файл ~/.screenrc и добавить туда escape <новый_символ>.

Можно заметить, что файлы конфигурации начинаются с символа .. Поэтому их называют dotfiles. Большинство инструментов хранят здесь свои настройки. Часто их удобно хранить в гите или облаке — тогда ими можно будет удобно пользоваться на новом сервере и каждый раз не вспоминать, где настраивается тот или иной hotkey. Но важно внимательно отслеживать, что именно лежит в ваших dotfiles, чтобы нечаянно не поделиться с кем-то своими паролями или приватными ключами.

Профилирование ресурсов

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

Давайте разберемся, как можно посмотреть применение разных ресурсов.

CPU+RAM

Здесь нам пригодится команда htop. В верхней части рисунка можно увидеть нагрузку на каждое ядро, количество использованной оперативной памяти, процессов и потоков. В нижней части — запущенные процессы и количество ресурсов, которые они применяют.

Рисунок 1. Результат выполнения команды htop. В верхней части — общая нагрузка, в нижней — нагрузка каждого процесса.
КолонкаОписание
PIDИдентификатор процесса (Process ID)
USERИмя пользователя, которому принадлежит процесс
PRIПриоритет процесса
%CPUПроцент использования процессора данным процессом. Если процесс использует более одного ядра — значение может быть больше 100%
%MEMПроцент использования физической памяти данным процессом
TIME+Общее время использования процессора данным процессом. Оно отличается от времени работы программы. Например, если процесс не использует cpu, то время будет всегда равно 0. Если процесс полностью использует два ядра — время будет в 2 раза больше реального времени работы команды
COMMANDКоманда или имя исполняемого файла, связанного с процессом

Также, если нажать F2 и перейти в раздел columns, то можно добавить дополнительные колонки, например, IO_READ_RATEи IO_WRITE_RATE — скорость чтения и записи на диск.

Диск

Для жесткого диска есть аналог htopiotop. Запускать его можно только через sudo.

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

Рисунок 2. Результат выполнения команды iotop

На настоящий момент iotop уже достаточно давно не обновлялся, но есть похожий инструмент — iotop-c.

Рисунок 3. Результат выполнения команды iotop-c

Видеокарта

Посмотреть состояние видеокарты можно через nvidia-smi:

Рисунок 4. Результат выполнения команды nvidia-smi. Таблица, которая выводится, не очень удобна для чтения

Эта команда показывает состояние на текущий момент времени. Ее можно сделать интерактивной с помощью watch.

Команда watch -n interval_sec command исполняет команду command каждые interval_sec секунд.

Но более удобное решение — команда nvtop.

Рисунок 5. Результат выполнения команды nvtop. Стоит отметить: она нагружена очень слабо

Если вы подключаетесь через putty — обязательно поставьте флажок enable VT10 line drawing в Window/translation. Иначе графики не будут корректно отображаться.

Сетевое соединение

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

Рисунок 6. Результат выполнения команды iftop

Переменные окружения

Для установки значения VALUE в переменную окружения VAR нужно использовать команду export KEY=value. Она установит ее локально: после перезапуска консоли и переменная, и значения пропадут. Если мы хотим установить ее глобально (чтобы она всегда была доступна), нужно воспользоваться файлом ~/.profile.

Простыми словами ~/.profile — скрипт, который выполняется при входе пользователя в систему. Есть также файлы ~/.bashrc и ~/.bash_profile. У них похожие функции, но в некоторых случаях добавление в ~./profile может не сработать. Подробнее о разнице этих файлов можно прочитать здесь.

Например, если мы хотим глобально установить значение VALUE в переменную окружения VAR — нам нужно дописать export KEY=value в конец ~/.profile.

echo "export KEY=value" >> ~/.profile

Синтаксис echo "text" >> filename дописывает text в конец файла filename .

А если мы хотим передать переменные окружения только во время конкретного запуска команды — мы можем просто прописать KEY1=value1 KEY2=value2 <command>. Например, у нас есть несколько видеокарт, и нам нужно запустить скрипт только на первых двух. Тогда мы делаем это так: CUDA_VISIBLE_DEVICES=0,1 python train.py.

Заключение

Шпаргалка

И в заключение прикрепляем шпаргалку с самыми полезными, на наш взгляд, командами для Linux. Их также можно использовать в ячейках с кодом в ноутбуках (например, в colab), добавив ! перед командой.

Пишите в комментариях свои команды — и мы добавим их сюда 😊😊​

КомандаОписаниеПример использования
lsПоказать содержимое директорииls (показать содержимое текущей папки) ls data (показать содержимое папки data)
cdСменить текущую директориюcd /home/user/Documents (перейти в директорию «Documents»)
pwdПоказать текущую директориюpwd (вывести текущую директорию)
mkdirСоздать новую директориюmkdir new_folder (создать директорию с именем «new_folder»)
rmУдалить файл или директориюrm file.txt (удалить файл «file.txt»)
cpСкопировать файлы и директорииcp file.txt backup/file_backup.txt (скопировать файл «file.txt» в директорию «backup» с именем «file_backup.txt»)
mvПереместить / переименовать файлы и директорииmv file.txt new_location/ (переместить файл «file.txt» в директорию «new_location») mv old_name.txt new_name.txt (переименовать файл «old_name.txt» в «new_name.txt»)
rsyncСинхронизировать файлы и директорииrsync -r source_directory/ destination_directory/ (рекурсивно синхронизировать содержимое директории «source_directory» с «destination_directory») rsync -r source_directory/ user@remote-host:destination_directory/ (рекурсивно синхронизировать содержимое директории «source_directory» с «destination_directory» по ssh)
catПоказать содержимое файлаcat file.txt (вывести содержимое файла «file.txt»)
headПоказать начало файлаhead -n 10 file.txt (показать первые 10 строк файла «file.txt»)
tailПоказать конец файлаtail -n 5 file.txt (показать последние 5 строк файла «file.txt»)
grepОсуществить поиск по шаблону в файлеgrep «pattern» file.txt (найти все строки, содержащие «pattern» в файле «file.txt»)
wcПосчитать количество строк, слов и символов в файлеwc -l file.txt (посчитать количество строк в файле «file.txt»)
sed/awkОтредактировать текстовые файлы и обработать данныеsed ‘s/old/new/g’ file.txt (заменить все вхождения «old» на «new» в файле «file.txt»)
jqОбработка JSON данныхjq ‘.’ file.json (вывести содержимое file.json в удобном формате) jq ‘.field’ file.json(вывести содержимое поля field из file.json в удобном формате)
apt/apt-getОсуществить управление пакетами (для Debian/Ubuntu)sudo apt install package_name (установить пакет «package_name»)
wget/curlЗагрузить данные из Интернетаwget http://example.com/file.txt (загрузить файл «file.txt» с сервера «example.com»)
tarАрхивировать и разархивировать файлыtar -xvf archive.tar.gz (разархивировать файлы из «archive.tar.gz»)
zip/unzipАрхивировать и разархивировать файлы в формате ZIPzip -r archive.zip folder/ (создать архив «archive.zip» с содержимым из папки «folder/»)
pingПроверить доступность хоста в сетиping google.com (проверить доступность сервера google.com)
sshПодключиться удаленно к серверу по SSHssh username@hostname (подключиться к серверу «hostname» от имени пользователя «username»)
screenСоздать виртуальные сессииscreen -s name (создать новую виртуальную сессию с именем name) screen -r name (подключиться к сессии name) screen -ls (вывести список сессий)
dfПоказать информацию о дисках и путь, по которому они смонтированыdf -h (показать информацию о месте на диске в удобном для чтения формате)
duПоказать используемое дисковое пространствоdu -sh /path/to/directory (показать размер указанной директории)
chmodИзменить права доступа к файлу или директорииchmod 755 file.txt (установить права 755 для файла file.txt) подробнее о значениях цифр можно прочитать здесь
chgrpИзменить группу владельца файла или директорииchgrp group_name file.txt (изменить группу владельца файла на group_name)
chownИзменить владельца файла или директорииchown user_name file.txt (изменить владельца файла на user_name)
nvidia-smiОсуществить мониторинг видеокартыnvidia-smi
nvtopОсуществить мониторинг видеокартыnvtop
iftopОсуществить мониторинг сетиiftop
watchЗапустить с определенной периодичностьюwatch -n interval_sec command (запускать команду command каждые interval_sec)
exportДобавить локальную ENV переменнуюexport KEY=value
echoВывести текстecho «text» >> file (вывести text в конец file)

Телеграм-канал

DeepSchool

Короткие посты по теории ML/DL, полезные
библиотеки и фреймворки, вопросы с собеседований
и советы, которые помогут в работе

Открыть Телеграм

Увидели ошибку?

Напишите нам в Telegram!