Перейти к содержанию

Linux

Linux для дата-инженера

Большинство DE-инфраструктуры работает на Linux. Даже если ты разрабатываешь на Windows/Mac, твои контейнеры, серверы и кластеры — это Linux.

Файловая система

Ключевые директории

Путь Назначение
/ Корень файловой системы
/home/user Домашняя директория пользователя
/etc Конфигурации системы и сервисов
/var/log Логи системы и приложений
/tmp Временные файлы (очищается при перезагрузке)
/opt Стороннее ПО
/usr/bin Системные утилиты
/proc Виртуальная ФС с информацией о процессах

Навигация и работа с файлами

Bash
# где я?
pwd

# содержимое директории (подробно)
ls -la

# размер директории
du -sh /var/log

# свободное место на дисках
df -h

# найти файл
find / -name "*.log" -mtime -1

# создать директорию с вложенными
mkdir -p /opt/etl/data/raw

Права доступа

Bash
# формат: владелец-группа-остальные (rwx)
ls -la pipeline.py
# -rwxr-xr-- 1 etl_user etl 1234 Apr 01 10:00 pipeline.py

# изменить права
chmod 755 pipeline.py   # rwxr-xr-x
chmod +x script.sh      # добавить право на выполнение

# изменить владельца
chown etl_user:etl pipeline.py
Число Права Значение
7 rwx Чтение, запись, выполнение
6 rw- Чтение, запись
5 r-x Чтение, выполнение
4 r-- Только чтение

Пользователи и группы

Bash
# текущий пользователь
whoami

# информация о пользователе
id etl_user

# создать пользователя
sudo useradd -m -s /bin/bash etl_user

# добавить в группу (например, docker)
sudo usermod -aG docker etl_user

# переключиться на другого пользователя
sudo su - etl_user

Группа docker

Чтобы запускать Docker без sudo, пользователь должен быть в группе docker: sudo usermod -aG docker $USER. Потребуется перелогин.

Процессы

Bash
# список процессов
ps aux

# найти конкретный процесс
ps aux | grep airflow

# в реальном времени (top с красивым UI)
htop

# убить процесс
kill PID         # мягко (SIGTERM)
kill -9 PID      # принудительно (SIGKILL)

# что занимает порт
lsof -i :8080
# или
ss -tlnp | grep 8080

Systemd и сервисы

Systemd — менеджер сервисов в большинстве Linux-дистрибутивов.

Bash
# статус сервиса
sudo systemctl status postgresql

# запустить / остановить / перезапустить
sudo systemctl start postgresql
sudo systemctl stop postgresql
sudo systemctl restart postgresql

# включить автозапуск
sudo systemctl enable postgresql

# журнал сервиса
sudo journalctl -u postgresql -f --since "1 hour ago"

SSH

Bash
# подключение к серверу
ssh user@192.168.1.100

# с указанием ключа
ssh -i ~/.ssh/id_ed25519 user@server.example.com

# копирование файла на сервер
scp data.csv user@server:/opt/etl/data/

# копирование директории
scp -r ./output/ user@server:/opt/etl/output/

# туннель (прокинуть порт БД)
ssh -L 5432:localhost:5432 user@server

SSH-ключи

Bash
# генерация ключа
ssh-keygen -t ed25519 -C "etl@company.com"

# копирование публичного ключа на сервер
ssh-copy-id user@server

Мониторинг и диагностика

Bash
# использование CPU и памяти
htop
free -h

# использование дисков
df -h
iostat -x 1

# сетевые соединения
ss -tlnp

# DNS
nslookup example.com
dig example.com

# проверка доступности хоста
ping -c 3 server.example.com

# HTTP-запрос
curl -s http://localhost:8080/health | jq .

# скачать файл
wget https://example.com/data.csv

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

Bash
# просмотр
echo $HOME
env | grep PG

# установка (текущая сессия)
export DATABASE_URL="postgresql://user:pass@localhost/db"

# установка навсегда (~/.bashrc или ~/.zshrc)
echo 'export DATABASE_URL="postgresql://user:pass@localhost/db"' >> ~/.bashrc
source ~/.bashrc

cron (планировщик задач)

Bash
# редактировать crontab текущего пользователя
crontab -e

# просмотреть
crontab -l

Формат: минута час день_месяца месяц день_недели команда

Text Only
# каждый день в 3:00 — запуск ETL
0 3 * * * /opt/etl/run_pipeline.sh >> /var/log/etl.log 2>&1

# каждый понедельник в 8:00 — отчёт
0 8 * * 1 /opt/etl/weekly_report.sh

# каждые 15 минут
*/15 * * * * /opt/etl/check_data.sh

cron и переменные окружения

cron запускает команды в минимальном окружении. Если скрипт зависит от переменных вроде DATABASE_URL, либо объяви их в скрипте, либо используй source ~/.bashrc в начале.

Проверь себя

Источники