Helcode | Хелкод | Скрипты и автоматизация
993 subscribers
52 photos
34 links
☎️ Контакты для связи: @helcodeadm
Download Telegram
Самая частая ошибка в cron: «Команда не найдена»

Знакомая история? Скрипт отлично runs из терминала, но в  cron падает с ошибкой command not found.

Всё потому, что cron работает в минимальном окружении! У него своя, очень скудная переменная PATH (часто просто /usr/bin:/bin). Он не видит ваши $HOME/.bashrc и любимые ~/bin.

Решение простое и железное: ВСЕГДА использовать полные пути!

 * * * * * myscript.sh
 * * * * * /home/user/scripts/myscript.sh

 * * * * * python3 script.py
 * * * * * /usr/bin/python3 /path/to/script.py

Найти полный путь к любой команде можно через which или whereis:
which python3
whereis node

Вывод: полные пути — это маст-хэв для любого крона.

🌐 @helcode | #linux #cron #ошибки #администрирование
4👍2
Куда смотрят логи? Настраиваем логирование для cron

Молчащий cron — самый опасный. Выполнилась задача или упала с ошибкой? Без грамотного логирования вы никогда не узнаете.

По умолчанию cron пытается отправить вывод на почту (MAILTO), но это часто не работает.

Берём логирование в свои руки!

Перенаправляем вывод (stdout + stderr) в файл:
* * * * * /path/to/script.sh >> /var/log/myscript.log 2>&1

Можно и раздельно:
* * * * * /path/to/script.sh >> /var/log/myscript.log 2>> /var/log/myscript.error.log

Профи-фишка: Логи с датой в названии для ротации.
0 0 * * * /path/to/daily_backup.sh >> "/var/log/backup_$(date +\%Y\%m\%d).log" 2>&1

❗️Важно: экранируйте `%` знаками обратного слеша, чтобы `cron` их не воспринял как перенос строки!

🌐 @helcode | #linux #cron #logging #debugging
👍71
Когда cron уже не enough? Смотрим в сторону systemd.timer

Cron — классика, но для сложных сценариев есть более мощная альтернатива — systemd.timer.

В чем его суперсила?

🎯 Точность до секунд (в cron — только минуты)
🎯 Запуск после пропуска: Сервер был выключен? cron пропустит задачу. systemd.timer с опцией Persistent=true — выполнит при следующем включении!
🎯 Зависимости: Можно указать, чтобы задача запускалась только после старта сети (After=network-online.target) или другого сервиса.
🎯 Встроенное логирование в journalctl: все логи задачи в одном месте

Пример таймера для ежедневного бэкапа в 3:00:
/etc/systemd/system/backup.timer

[Timer]
OnCalendar=*-*-* 03:00:00
Persistent=true


Вывод: для простых задач — cron. Для сложных, надежных и интегрированных в систему — systemd.timer.

🌐 @helcode | #bash #linux #systemd #cron #automation
🔥5
Как на самом деле работает cron? 🤔

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

Всё расписание хранится в crontab-файлах. Синтаксис строки — это 5 полей:

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

Примеры:
 0 * * * *  — каждый час в 00 минут.
 0 0 * * 0  — каждое воскресенье в полночь.
  */15 * * * *  — каждые 15 минут.
  0 4 1 * *  — первое число месяца в 4 утра.

Есть и специальные слова для ленивых (как мы все):
@yearly@monthly@weekly@daily, @hourly@reboot

Вопрос на засыпку: что выполняется чаще: @daily или 0 0 * * *?

Ответ: это одно и то же! Ха-ха-ха)))))))))))))))))

🌐 @helcode | #linux #cron #howto
👍1
Тайминги и блокировки: как избежать «снежного кома» в cron

🤔 Представьте: задача в cron -е запускается каждые 5 минут, но иногда выполняется 10. Что будет? Через час у вас будет 12 параллельных процессов, грузящих систему!

Это классическая проблема наложения задач.

Решения:

1. timeout: жестко ограничить время выполнения.
* * * * * timeout 300 /path/to/script.sh # Остановить через 5 минут

2. flock: поставить блокировку на файл, чтобы скрипт не запускался, если предыдущий экземпляр еще работает.
* * * * * /usr/bin/flock -n /tmp/myscript.lock /path/to/script.sh


Ключ -n означает «не ждать». Если скрипт уже работает — новый запуск просто проигнорируется. Идеально для защиты от дублирования!

🌐 @helcode | #linux #cron #automation #performance
3👎1🤔1
Процесс, Поток, Демон: кто из них многозадачник, а кто – невидимка?

В мире Linux-автоматизации эти трое - основа основ. Путаница в них может стоить вам ресурсов сервера или нестабильной работы скрипта. Давайте расставим все по полочкам!

Теория:
➤ Процесс - это тяжеловес. Программа в работе со своим адресным пространством, памятью и данными. Как отдельный запущенный экземпляр браузера.
➤ Поток (Thread) - это легковес внутри процесса. У процессов могут быть свои «потоки-министры», которые делят между собой память и ресурсы родителя, но выполняют задачи параллельно. Экономят ресурсы, но усложняют дебаг.
➤ Демон (Daemon) - это процесс-отшельник. Он работает в фоне, не привязан к терминалу и обычно запускается при старте системы. Ваш веб-сервер (nginx) или cron - классические демоны.

Посмотреть все процессы можно классикой: ps aux. А чтобы найти демоны, ищите те, у которых в столбце TTY стоит ?.

А вы как предпочитаете писать многопоточные приложения? Python с threading, Go с горутинами, или старый добрый C? Поделитесь опытом в комментах!

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


🌐 @helcode | #linux
xargs: или как заставить одну команду работать с тысячей аргументов

Вывод ls, find или grep часто нужно скормить другой команде (например, rm или mv). Но большинство утилит не принимают вход из пайпа. xargs — это мост между ними.

➤ Массовое удаление: find . -name "*.tmp" | xargs rm -f
(Найди все .tmp файлы и передай их имена команде rm)
➤ Параллельный запуск: cat urls.txt | xargs -P 5 -I {} curl -O {}
(-P 5 запустит 5 параллельных закачек curl)
➤ Для сложных имен (с переносами и пробелами): find . -name "*.log" -print0 | xargs -0 ls -la
(-print0 и -0 используют нулевой байт как разделитель — это безопасно)

xargs берет элементы из стандартного ввода, формирует из них аргументы и подставляет в указанную команду.

А вы используете xargs?


🌐 @helcode | #linux
👍5
Grep: 5 флагов, которые вернут вам часы жизни

Ручной поиск по логам или коду — это адское занятие. grep — Ваш первый и главный друг в этой битве. Но знание всего пары флагов превращает его из молотка в целый "швейцарский нож".

🛠 Пример:
Допустим, ищем упоминания error в проекте:
-r (рекурсивно): grep -r "error" /path/to/project/ (обыщет все файлы во всех папках)
-i (игнорируй регистр): grep -i "connection" file.log (найдёт и Connection, и CONNECTION)
-c (покажи count): grep -c "404" access.log (не покажет строки, просто посчитает количество 404-ых ошибок)
-A, -B, -C (контекст):
1) grep -A 3 "Exception" log.txt (покажет строку с исключением и 3 строки после)
2) grep -B 2 "panic" log.txt (покажет строку с паникой и 2 строки до)
3) grep -C 1 "timeout" log.txt (покажет строку с таймаутом и по 1 строке до и после)

Флаги -A (After), -B (Before), -C (Context) — это спасение при чтении логов, где важно понять, что привело к ошибке и что было после.

Какой ваш самый частый или самый сумасшедший grep-однострочник?

Grep без этих флагов — это как искать иголку в стоге сена без магнита. А с ними — у Вас есть магнит, металлоискатель и карта, где спрятана вторая иголка.


🌐 @helcode | #linux
🤝61🔥1
Grep, Sed, Awk: святая троица текстовых ниндзя. Кого и когда использовать?

Вам нужно обработать текст в терминале. Вы открываете мануал и теряетесь между этими тремя гигантами. У каждого своя суперсила, и главное — не таскать воду awk-ом, когда достаточно grep-сита.

grep — это сито. Его задача — фильтровать строки. Найти те, что подходят под шаблон, и пропустить их дальше. Идеален для простого поиска.
➤ Пример: grep "error" log.txt
sed — это скальпель. Его сила — точечное редактирование текста (замена, удаление строк). Работает построчно.
➤ Пример: sed 's/foo/bar/g' file.txt (заменить все "foo" на "bar")
awk — это комбайн. Целый язык для обработки данных. Мощь в работе со столбцами и сложной логикой.
➤ Пример: awk '{print $1}' file.txt (напечатать только первый столбец каждой строки)

Пример (комбо):
Посмотреть процессы Python и оставить только их PID:
ps aux | grep python | awk '{print $2}'

Какой инструмент из троицы ваш любимый и за что вы его любите?

🌐 @helcode | #linux
👍8
Tar: архивируем это немедленно! 🗄

Нужно срочно передать кучу файлов, сделать бэкап или положить что-то на долгое хранение? tar — Ваш верный друг. Главное — не утонуть в его флагах.

🛠 Пример:
➤ Создать архив (c - create):
tar -cf archive.tar file1.txt dir/
➤ Создать архив со сжатием gzip (z - gzip):
tar -czf project_backup.tar.gz project_dir/
➤ Распаковать архив (x - extract):
tar -xf archive.tar
➤ Распаковать в определенную директорию (C - change to directory):
tar -xf archive.tar -C /path/to/target/
➤ Просмотреть содержимое архива (t - list):
tar -tf archive.tar

Объяснение:
-c — создать.
-x — извлечь.
-t — посмотреть.
-f — указать имя файла (обязательный флаг!).
-z — работать с gzip (используйте для .tar.gz или .tgz).
-j — работать с bzip2 (для .tar.bz2).
-v — verbose (показывать процесс, но не используйте в скриптах!).

А вы какой алгоритм сжатия предпочитаете? Старый добрый gzip (-.gz), более жесткий bzip2 (-.bz2) или современный xz (-.xz)? И почему?

Команда tar без флага -f — это как попытка заварить чай без чайника. Вода есть, чай есть, а результата нет. Система любезно напомнит Вам об этом. 😉


🌐 @helcode | #linux
👍81