Самая частая ошибка в cron: «Команда не найдена»
Знакомая история? Скрипт отлично runs из терминала, но в
Всё потому, что
Решение простое и железное: ВСЕГДА использовать полные пути!
❌
✅
❌
✅
Найти полный путь к любой команде можно через
Вывод: полные пути — это маст-хэв для любого крона.
🌐 @helcode | #linux #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
Молчащий
По умолчанию
Берём логирование в свои руки!
Перенаправляем вывод (stdout + stderr) в файл:
Можно и раздельно:
Профи-фишка: Логи с датой в названии для ротации.
❗️Важно: экранируйте `%` знаками обратного слеша, чтобы `cron` их не воспринял как перенос строки!
🌐 @helcode | #linux #cron #logging #debugging
Молчащий
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
👍7❤1
Когда cron уже не enough? Смотрим в сторону systemd.timer
В чем его суперсила?
🎯 Точность до секунд (в cron — только минуты)
🎯 Запуск после пропуска: Сервер был выключен?
🎯 Зависимости: Можно указать, чтобы задача запускалась только после старта сети (
🎯 Встроенное логирование в
Пример таймера для ежедневного бэкапа в 3:00:
Вывод: для простых задач —
🌐 @helcode | #bash #linux #systemd #cron #automation
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? 🤔
Всё расписание хранится в
Примеры:
⏰
⏰
⏰
⏰
Есть и специальные слова для ленивых (как мы все):
❔Вопрос на засыпку: что выполняется чаще:
✅ Ответ:это одно и то же! Ха-ха-ха)))))))))))))))))
🌐 @helcode | #linux #cron #howto
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
🤔 Представьте: задача в
Это классическая проблема наложения задач.
Решения:
1.
2.
Ключ
🌐 @helcode | #linux #cron #automation #performance
🤔 Представьте: задача в
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 - классические демоны.
Посмотреть все процессы можно классикой:
А вы как предпочитаете писать многопоточные приложения? Python с threading, Go с горутинами, или старый добрый C? Поделитесь опытом в комментах!
🌐 @helcode | #linux
В мире Linux-автоматизации эти трое - основа основ. Путаница в них может стоить вам ресурсов сервера или нестабильной работы скрипта. Давайте расставим все по полочкам!
Теория:
➤ Процесс - это тяжеловес. Программа в работе со своим адресным пространством, памятью и данными. Как отдельный запущенный экземпляр браузера.
➤ Поток (Thread) - это легковес внутри процесса. У процессов могут быть свои «потоки-министры», которые делят между собой память и ресурсы родителя, но выполняют задачи параллельно. Экономят ресурсы, но усложняют дебаг.
➤ Демон (Daemon) - это процесс-отшельник. Он работает в фоне, не привязан к терминалу и обычно запускается при старте системы. Ваш веб-сервер (nginx) или cron - классические демоны.
Посмотреть все процессы можно классикой:
ps aux. А чтобы найти демоны, ищите те, у которых в столбце TTY стоит ?.А вы как предпочитаете писать многопоточные приложения? Python с threading, Go с горутинами, или старый добрый C? Поделитесь опытом в комментах!
Если процесс — это целый завод, то потоки — это цехи на этом заводе. А демон — это заводской призрак, который работает ночью, пока все спят.
🌐 @helcode | #linux
xargs: или как заставить одну команду работать с тысячей аргументов
Вывод
➤ Массовое удаление:
(Найди все .tmp файлы и передай их имена команде
➤ Параллельный запуск:
(
➤ Для сложных имен (с переносами и пробелами):
(
А вы используете xargs?
🌐 @helcode | #linux
Вывод
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 флагов, которые вернут вам часы жизни
Ручной поиск по логам или коду — это адское занятие.
🛠 Пример:
Допустим, ищем упоминания
➤
➤
➤
➤
1)
2)
3)
Флаги
Какой ваш самый частый или самый сумасшедший grep-однострочник?
🌐 @helcode | #linux
Ручной поиск по логам или коду — это адское занятие.
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
🤝6❤1🔥1
Grep, Sed, Awk: святая троица текстовых ниндзя. Кого и когда использовать?
Вам нужно обработать текст в терминале. Вы открываете мануал и теряетесь между этими тремя гигантами. У каждого своя суперсила, и главное — не таскать воду
➤
➤ Пример:
➤
➤ Пример:
➤
➤ Пример:
Пример (комбо):
Посмотреть процессы Python и оставить только их PID:
Какой инструмент из троицы ваш любимый и за что вы его любите?
🌐 @helcode | #linux
Вам нужно обработать текст в терминале. Вы открываете мануал и теряетесь между этими тремя гигантами. У каждого своя суперсила, и главное — не таскать воду
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: архивируем это немедленно! 🗄
Нужно срочно передать кучу файлов, сделать бэкап или положить что-то на долгое хранение?
🛠 Пример:
➤ Создать архив (c - create):
➤ Создать архив со сжатием gzip (z - gzip):
➤ Распаковать архив (x - extract):
➤ Распаковать в определенную директорию (C - change to directory):
➤ Просмотреть содержимое архива (t - list):
Объяснение:
➤
➤
➤
➤
➤
➤
➤
А вы какой алгоритм сжатия предпочитаете? Старый добрый gzip (-.gz), более жесткий bzip2 (-.bz2) или современный xz (-.xz)? И почему?
🌐 @helcode | #linux
Нужно срочно передать кучу файлов, сделать бэкап или положить что-то на долгое хранение?
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
👍8❤1