Полезные Linux-команды
Введение
В этой статье мы расскажем о нескольких 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:
Функция | Screen | Tmux |
---|---|---|
Начать новую сессию с именем session_name | screen -S session_name | tmux new -t session_name |
Подключиться к сессии с идентификатором process_id или с именем session_name | screen -r process_id/session_name | tmux a -t process_id/session_name |
Переименовать сессию | Ctrl+a :sessionname session_name | Ctrl+b $ |
Отсоединиться от сессии | Ctrl+a d | Ctrl+b d |
Для обеих команд можно изменить escape комбинацию клавиш. Как это сделать? Для Tmux нужно создать файл ~/.tmux.conf
и добавить туда строчку set-option -g prefix <новый_символ>
, а для Screen — создать файл ~/.screenrc
и добавить туда escape <новый_символ>
.
Можно заметить, что файлы конфигурации начинаются с символа .
. Поэтому их называют dotfiles. Большинство инструментов хранят здесь свои настройки. Часто их удобно хранить в гите или облаке — тогда ими можно будет удобно пользоваться на новом сервере и каждый раз не вспоминать, где настраивается тот или иной hotkey
. Но важно внимательно отслеживать, что именно лежит в ваших dotfiles
, чтобы нечаянно не поделиться с кем-то своими паролями или приватными ключами.
Профилирование ресурсов
Когда мы обучаем модельки, мы хотим максимально эффективно использовать ресурсы рабочей машины для более быстрых результатов.
Давайте разберемся, как можно посмотреть применение разных ресурсов.
CPU+RAM
Здесь нам пригодится команда htop
. В верхней части рисунка можно увидеть нагрузку на каждое ядро, количество использованной оперативной памяти, процессов и потоков. В нижней части — запущенные процессы и количество ресурсов, которые они применяют.
Колонка | Описание |
---|---|
PID | Идентификатор процесса (Process ID) |
USER | Имя пользователя, которому принадлежит процесс |
PRI | Приоритет процесса |
%CPU | Процент использования процессора данным процессом. Если процесс использует более одного ядра — значение может быть больше 100% |
%MEM | Процент использования физической памяти данным процессом |
TIME+ | Общее время использования процессора данным процессом. Оно отличается от времени работы программы. Например, если процесс не использует cpu, то время будет всегда равно 0. Если процесс полностью использует два ядра — время будет в 2 раза больше реального времени работы команды |
COMMAND | Команда или имя исполняемого файла, связанного с процессом |
Также, если нажать F2
и перейти в раздел columns
, то можно добавить дополнительные колонки, например, IO_READ_RATE
и IO_WRITE_RATE
— скорость чтения и записи на диск.
Диск
Для жесткого диска есть аналог htop
—iotop
. Запускать его можно только через sudo
.
Здесь в верхней части экрана находится сводное потребление ресурсов, а в нижней — процессы, которые используют диск.
На настоящий момент iotop уже достаточно давно не обновлялся, но есть похожий инструмент — iotop-c.
Видеокарта
Посмотреть состояние видеокарты можно через nvidia-smi
:
Эта команда показывает состояние на текущий момент времени. Ее можно сделать интерактивной с помощью watch
.
Команда watch -n interval_sec command
исполняет команду command
каждые interval_sec
секунд.
Но более удобное решение — команда nvtop
.
Если вы подключаетесь через putty — обязательно поставьте флажок enable VT10 line drawing в Window/translation
. Иначе графики не будут корректно отображаться.
Сетевое соединение
iftop
— отличное решение на случай, если вам понадобится мониторить сетевое соединение. Запускать эту команду можно только через sudo
.
Переменные окружения
Для установки значения 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 | Архивировать и разархивировать файлы в формате ZIP | zip -r archive.zip folder/ (создать архив «archive.zip» с содержимым из папки «folder/») |
ping | Проверить доступность хоста в сети | ping google.com (проверить доступность сервера google.com) |
ssh | Подключиться удаленно к серверу по SSH | ssh 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) |