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

Linux: продвинутое

Зачем это DE?

Data Engineer живёт в Linux: серверы, контейнеры, SSH, cron. Понимание процессов, сетей, дисков и systemd — разница между «перезагрузил и заработало» и «нашёл корень проблемы за 5 минут».


Процессы

ps и top

Bash
# Все процессы
ps aux | head -20

# По конкретному имени
ps aux | grep postgres

# top с сортировкой по памяти
top -o %MEM

# htop — удобная альтернатива
htop

Управление процессами

Bash
# Фоновый запуск
long_script.sh &

# Список фоновых задач
jobs

# Вернуть в foreground
fg %1

# Завершить процесс
kill PID          # SIGTERM (мягкое)
kill -9 PID       # SIGKILL (жёсткое, последний шанс)

# Завершить по имени
pkill -f "python etl_pipeline.py"

nohup и disown

Bash
# Процесс продолжает работу после закрытия SSH
nohup python pipeline.py > pipeline.log 2>&1 &

# Или: отвязать уже запущенный процесс
python pipeline.py &
disown %1

/proc — информация о процессах

Bash
# Память процесса
cat /proc/PID/status | grep VmRSS

# Лимиты процесса (max open files и др.)
cat /proc/PID/limits

# Переменные окружения
cat /proc/PID/environ | tr '\0' '\n'

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

df и du

Bash
# Использование дисков
df -h

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

# Топ-10 самых больших директорий
du -h --max-depth=1 /var | sort -rh | head -10

Поиск больших файлов

Bash
# Файлы > 1 GB
find / -type f -size +1G -exec ls -lh {} \; 2>/dev/null

# Старые логи
find /var/log -name "*.log" -mtime +30 -exec ls -lh {} \;

iostat — I/O дисков

Bash
iostat -xz 1
# %util > 80% → диск перегружен
# await > 20ms → медленный I/O

Сети

Основные команды

Bash
# Сетевые интерфейсы и IP
ip addr show

# Таблица маршрутизации
ip route

# DNS-резолв
dig example.com
nslookup example.com

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

# Трассировка маршрута
traceroute google.com

Порты и соединения

Bash
# Кто слушает порт 5432
ss -tlnp | grep 5432
# или
lsof -i :5432

# Все установленные TCP-соединения
ss -tn state established

# Проверить открыт ли порт
nc -zv db-host 5432

curl — отладка HTTP

Bash
# GET с заголовками
curl -v https://api.example.com/health

# POST JSON
curl -X POST https://api.example.com/data \
     -H "Content-Type: application/json" \
     -d '{"key": "value"}'

# Скачать файл
curl -o data.csv https://example.com/data.csv

# Замерить время ответа
curl -o /dev/null -s -w "Connect: %{time_connect}s\nTTFB: %{time_starttransfer}s\nTotal: %{time_total}s\n" \
     https://api.example.com/health

systemd

Управление сервисами

Bash
# Статус
systemctl status postgresql

# Старт/стоп/рестарт
sudo systemctl start postgresql
sudo systemctl stop postgresql
sudo systemctl restart postgresql

# Автозапуск при загрузке
sudo systemctl enable postgresql
sudo systemctl disable postgresql

# Логи сервиса
journalctl -u postgresql -f         # follow
journalctl -u postgresql --since today
journalctl -u postgresql -n 100     # последние 100 строк

systemd timer — замена cron

INI
# /etc/systemd/system/etl-pipeline.service
[Unit]
Description=Daily ETL Pipeline

[Service]
Type=oneshot
User=etl
ExecStart=/home/etl/pipeline/run.sh
StandardOutput=journal
StandardError=journal
INI
# /etc/systemd/system/etl-pipeline.timer
[Unit]
Description=Run ETL daily at 3:00

[Timer]
OnCalendar=*-*-* 03:00:00
Persistent=true        # запустить если пропустили (сервер был выключен)

[Install]
WantedBy=timers.target
Bash
sudo systemctl enable --now etl-pipeline.timer
systemctl list-timers  # список активных таймеров

Отладка

strace — системные вызовы

Bash
# Что делает процесс (какие файлы открывает, сетевые вызовы)
strace -p PID -e trace=open,read,write -f

# Запустить с трассировкой
strace -o trace.log python pipeline.py

lsof — что открыл процесс

Bash
# Открытые файлы процесса
lsof -p PID

# Кто открыл файл
lsof /var/log/postgresql.log

# Кто использует порт
lsof -i :8080

dmesg — сообщения ядра

Bash
# OOM-killer убил процесс?
dmesg | grep -i "out of memory"
dmesg | grep -i "killed process"

Полезные однострочники для DE

Bash
# Количество строк в CSV
wc -l data.csv

# Уникальные значения столбца (2-й)
awk -F',' '{print $2}' data.csv | sort -u | wc -l

# Быстрый просмотр структуры CSV
head -1 data.csv | tr ',' '\n' | cat -n

# Размер БД PostgreSQL
sudo -u postgres psql -c "SELECT pg_size_pretty(pg_database_size('dwh'));"

# Мониторинг в реальном времени
watch -n 5 'psql -c "SELECT count(*) FROM orders WHERE order_date = current_date"'

# Параллельная обработка файлов
ls *.csv | xargs -P 4 -I {} python process.py {}

Что запомнить

Область Ключевые инструменты Когда
Процессы ps, top, kill, nohup Отладка зависших пайплайнов
Диски df, du, iostat Заполнился диск, медленный I/O
Сети ss, curl, nc, dig Не подключается к БД/API
systemd systemctl, journalctl, timers Управление сервисами, расписание
Отладка strace, lsof, dmesg Глубокий troubleshooting

Проверь себя


Источники