В systemd есть встроенный механизм автоматического перезапуска сервисов при их падении. Управляется это параметром Restart в разделе [Service] unit-файла.
always - перезапуск всегда (даже при корректном завершении)
on-success – только если сервис завершился без ошибок
on-failure – при ошибках или принудительном завершении (SIGKILL, timeout)
on-abnormal – при завершении сигналом или зависании
on-abort – если сервис был принудительно завершён
on-watchdog – при срабатывании watchdog timeout
no – автозапуск отключен (значение по умолчанию)
Редактировать основной unit-файл не нужно. Достаточно создать override.conf:
mkdir -p /etc/systemd/system/nginx.service.d
nano /etc/systemd/system/nginx.service.d/override.conf
Добавьте настройки:
[Service]
Restart=always
RestartSec=5s
Примените изменения:
systemctl daemon-reload
Теперь при падении Nginx перезапустится через 5 секунд. Проверка:
systemctl status nginx
kill -9 <PID>
systemctl status nginx
1. Базы данных (MySQL, PostgreSQL) – после аварии могут запустить ресурсоёмкое восстановление, которое OOM-killer прервёт, создавая бесконечный цикл.
2. Кластеры (Elasticsearch, Ceph) – возможна рассинхронизация или некорректная работа.
Для веб-серверов (Nginx, Apache), почтовых сервисов (Postfix, Dovecot) и агентов мониторинга (Zabbix Agent) – автозапуск обычно безопасен.
Добавьте в override.conf, чтобы получать уведомления:
[Unit]
OnFailure=your-notify-script.service
Это может быть скрипт с отправкой алерта в Telegram или email.
#linux #systemd
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18❤1
Автоматическое монтирование дисков в Linux через systemd
Многие по привычке используют
Это особенно полезно:
📍 в средах с динамически подключаемыми дисками
📍 при работе с нестабильными устройствами (например, сетевыми томами)
📍 для точного контроля зависимостей и порядка монтирования
▪️ Пример: монтируем диск /dev/sdb1 в /mnt/data
1️⃣ Создаём unit-файл для монтирования:
Пример содержимого:
Обратите внимание: имя unit-файла mnt-data.mount формируется по пути монтирования: /mnt/data → mnt-data.mount
2️⃣ Активируем и проверяем
Проверим статус:
⭐️ Преимущества systemd-монтажа:
🌟 Важно: если диск может не быть доступен при загрузке, рассмотрите опции nofail или отложенное монтирование через automount.
#linux #systemd
🧑💻 NetworkAdmin
Многие по привычке используют
fstab для автоподключения дисков в линукс. Но systemd предлагает более гибкий и надёжный механизм - монтирование через unit-файлы.Это особенно полезно:
sudo systemctl edit --force --full mnt-data.mount
Пример содержимого:
[Unit]
Description=Монтирование диска в /mnt/data
After=network.target
[Mount]
What=/dev/sdb1
Where=/mnt/data
Type=ext4
Options=defaults
[Install]
WantedBy=multi-user.target
Обратите внимание: имя unit-файла mnt-data.mount формируется по пути монтирования: /mnt/data → mnt-data.mount
sudo systemctl daemon-reexec
sudo systemctl enable mnt-data.mount
sudo systemctl start mnt-data.mount
Проверим статус:
systemctl status mnt-data.mount
📍 Учитываются зависимости (можно настроить Requires= и After=)📍 Возможность рестартов и таймаутов📍 Удобство в контейнерах и виртуальных средах📍 Логирование и отладка через journalctl
#linux #systemd
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14❤1
Systemd timers - это более современный и гибкий способ планирования задач в linux, особенно на серверах с systemd.📍 Логирование по умолчанию - systemd записывает stdout/stderr задачи в journal, не нужно вручную перенаправлять вывод📍 Зависимости и условия запуска - можно привязать таймер к другим сервисам, целям (targets) и условиям📍 Точный контроль времени и интервалов - есть OnCalendar, OnBootSec, OnUnitActiveSec и другие📍 Простой мониторинг - можно посмотреть статус задачи: когда запускалась, сколько длилась, когда запустится снова📍 Юзер-таймеры - можно создавать таймеры без root-доступа для отдельных пользователей
Пример: бэкап в /var/backups каждую ночь в 3:00
vi /etc/systemd/system/backup.service
[Unit]
Description=Nightly backup
[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh
vi /etc/systemd/system/backup.timer
[Unit]
Description=Run backup script daily at 3AM
[Timer]
OnCalendar=*-*-* 03:00:00
Persistent=true
[Install]
WantedBy=timers.target
Активируем:
sudo systemctl daemon-reexec
sudo systemctl enable --now backup.timer
systemctl list-timers
systemctl status backup.timer
journalctl -u backup.service
[Timer]
OnBootSec=5min
Каждые 15 минут:
[Timer]
OnUnitActiveSec=15min
Каждый понедельник в 6 утра:
[Timer]
OnCalendar=Mon *-*-* 06:00:00
📍 Устанавливайте Persistent=true, чтобы таймер отработал, даже если система была выключена в момент запуска📍 Используйте systemctl cat для просмотра активных юнитов📍 Для задач от пользователя используйте ~/.config/systemd/user/
#systemd #cron
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14❤2
Если вы работаете на современном дистрибутиве linux, то почти наверняка используете systemd, а значит - и journald для сбора логов. Это система логирования, которая умеет куда больше, чем просто показывать логи командой journalctl. Сегодня - о том, как удобно фильтровать и разделять логи по уровню важности (info, warning, error и т.д.) и сервисам, чтобы быстро находить нужную информацию.
journalctl -u nginx.service
Добавьте -b для вывода только с текущей загрузки:
journalctl -u ssh.service -b
journalctl -p err # Только ошибки и критичнее
Список уровней (от менее к более важным):
0: emerg
1: alert
2: crit
3: err
4: warning
5: notice
6: info
7: debug
Пример: показать все warning и выше от sshd:
journalctl -u ssh.service -p warning
journalctl --since "1 hour ago"
journalctl --since "2025-09-18" --until "2025-09-19 03:00"
/run/log/journal (в RAM), если /var/log/journal отсутствует. Чтобы сохранять логи между перезагрузками:
mkdir -p /var/log/journal
systemd-tmpfiles --create --prefix /var/log/journal
systemctl restart systemd-journald
/etc/systemd/journald.conf можно настроить:
Storage=persistent
SystemMaxUse=500M
RuntimeMaxUse=100M
MaxRetentionSec=7day
После правок - перезапустите journald:
systemctl restart systemd-journald
journalctl _TRANSPORT=kernel -p err
Фильтр по PID:
journalctl _PID=1234
По имени бинарника:
journalctl _COMM=nginx
#logs #systemd
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13❤5
Systemd умеет не только собирать и хранить логи, но и отдавать их по HTTP. Для этого есть служба
systemd-journal-gatewayd, которая позволяет просматривать журнал прямо в браузере. Настраивается все буквально в пару шагов (пример для debian).
apt install systemd-journal-remote
Запускаем службу:
systemctl start systemd-journal-gatewayd.service
По умолчанию используется порт 19531.
http://10.25.1.55:19531/browse
Только логи текущей загрузки:
http://10.25.1.55:19531/entries?boot
В интерфейсе удобно переключаться между сервисами через выпадающий список.
curl --silent -H 'Accept: application/json' \
'http://10.25.1.55:19531/entries?UNIT=ssh.service'
systemd-journal-gatewayd умеет работать не только с локальным журналом, но и с логами, собранными с других серверов. Для этого можно указать директорию с журналами:
systemd-journal-gatewayd -D /path/to/logs
#systemd #logs
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
Одна из полезных практик на пути к оптимизации - переодически смотреть, а что вообще запускается и что из этого действительно нужно, а что можно отключить. Это будет полезно не только для оптимизации, но и для безопасности тоже.
systemctl list-unit-files --state=enabled
Команда покажет список всех юнитов, которые стартуют при загрузке. Также полезно посмотреть реально работающие процессы:
systemctl list-units --type=service
systemctl disable avahi-daemon.service
Чтобы остановить прямо сейчас:
systemctl stop avahi-daemon.service
Если сервис не нужен вообще - можно замаскировать, чтобы исключить случайный запуск:
systemctl mask avahi-daemon.service
(при этом запуск будет невозможен даже вручную, пока не сделаете unmask).
Примеры сервисов, которые часто не используются:
avahi-daemon.service - autodiscovery (не нужен на сервере)
bluetooth.service - если нет блютуза
ModemManager.service - если не используется мобильный модем
rpcbind.service - устаревший RPC, не нужен большинству
Далее уже зависит конкретно от Ваших потребностей и ситуации.
systemctl list-unit-files --state=enabled
#linux #systemd
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13🔥2❤1
journalctl - это инструмент работы с логами systemd.
journalctl -u ssh
journalctl -u nginx -u php-fpm
Последние записи сервиса в реальном времени (аналог tail -f):
journalctl -u nginx -f
journalctl --since "2025-10-01" --until "2025-10-15"
journalctl --since "1 hour ago"
journalctl --since yesterday
journalctl -u ssh | grep "Failed password"
Или встроенный фильтр по приоритету (severity):
journalctl -p err -u ssh
(-p принимает диапазон: -p warning..crit)
journalctl -b # текущая загрузка
journalctl -b -1 # предыдущая загрузка
journalctl -b -2 # еще раньше
Сохранить в файл:
journalctl -u nginx --since today > nginx.log
Экспорт в бинарный лог и перенос на другой сервер:
journalctl --vacuum-time=7d # удалить старше 7 дней
journalctl --vacuum-size=1G # ограничить объем
#systemd #journalctl
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12
Один из частых вопросов: почему система грузится так долго? Для раскрытия этой тайны можно использовать встроенный инструмент
systemd-analyze, который покажет подробную статистику загрузки и поможет найти узкие места.
systemd-analyze
Пример вывода:
Startup finished in 2.351s (kernel) + 8.512s (userspace) = 10.863s
kernel - время работы ядра до запуска systemd
userspace - запуск сервисов и инициализация systemd
итоговое время загрузки
systemd-analyze blame
Вывод отсортирован по времени запуска. На первых строках будут виновники торжества.
systemd-analyze critical-chain
Она покажет цепочку сервисов, которые напрямую влияют на общее время старта.
Для детального графа в SVG:
systemd-analyze plot > boot.svg
Файл можно открыть в браузере - это визуализация всех юнитов и их зависимостей.
systemctl disable bluetooth.service
systemctl disable cups.service
Например, если дольше всего грузится NetworkManager-wait-online.service, можно сократить или отключить ожидание сети.
systemctl mask service_name
#systemd #boot
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤3
Systemd давно стал стандартом для запуска, управления и наблюдения за сервисами. Но многие используют его только для управления уже существующими демонами и не создают собственные unit-файлы, а ведь это удобный способ автоматизировать любые скрипты, фоновые процессы или приложения.
/etc/systemd/system/
Пример простого сервиса, который запускает bash-скрипт:
/etc/systemd/system/myapp.service
[Unit]
Description=My custom app
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/myapp.sh
Restart=on-failure
User=myuser
Group=myuser
[Install]
WantedBy=multi-user.target
Несколько рекомендаций по параметрам:Type=simple- подходит для скриптов и обычных демоновRestart=on-failure- перезапуск при сбояхUser=…- всегда запускайте сервисы НЕ от root, если это возможноAfter=network.target- ожидаем сеть перед запуском
указываем shebang (#!/bin/bash);
используем абсолютные пути к бинарникам;
перенаправляем вывод в syslog или файл (если нужно);
завершаемся с кодами ошибок.
Пример:
#!/bin/bash
set -e
echo "Service started"
ping -c 1 8.8.8.8
Не забываем:
chmod +x /usr/local/bin/myapp.sh
systemctl daemon-reload
systemctl enable --now myapp.service
Проверяем статус:
systemctl status myapp.service
Посмотреть логи сервиса:
journalctl -u myapp.service -f
Проверить последнюю ошибку:
systemctl status myapp.service
Проверить, что systemd видит изменения:
systemctl daemon-reload
Принудительно перезапустить сам процесс:
systemctl restart myapp.service
LimitNOFILE - увеличить максимальное количество файлов
LimitNOFILE=65535WorkingDirectory - задать рабочую директорию
WorkingDirectory=/opt/myappEnvironment - задать переменные окружения
Environment="APP_ENV=prod"
ProtectSystem=full
ProtectHome=true
PrivateTmp=true
NoNewPrivileges=true
#linux #systemd
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11❤1
Хотя многие админы по привычке используют /etc/fstab, у systemd есть собственный механизм монтирования, который во многом удобнее и современнее.
📍 Почему systemd лучше, чем fstab?1️⃣ Автомонтирование при обращении - устройство подключается только тогда, когда к нему обращаются, и может автоматически отключаться по заданному таймауту.2️⃣ Автосоздание точек монтирования - systemd сам создает нужные директории, администратору не нужно следить за их наличием.3️⃣ Гибкая работа с таймаутами - если устройство недоступно, загрузка системы не повиснет, как это иногда бывает с fstab.4️⃣ Зависимости от сервисов - можно задать, что монтирование произойдёт только после старта VPN или другого сервиса, который необходим для доступа к диску.
/etc/systemd/system/mnt-backup.mount:
[Unit]
Description=Disk for backups
[Mount]
What=/dev/disk/by-uuid/f774fad3-2ba0-47d1-a20b-0b1c2ae1b7d6
Where=/mnt/backup
Type=ext4
Options=defaults
[Install]
WantedBy=multi-user.target
cfdisk /dev/sdb #создаем раздел
mkfs -t ext4 /dev/sdb1 #форматируем
blkid #смотрим UUID
systemctl daemon-reload
systemctl start mnt-backup.mount
systemctl enable mnt-backup.mount
/etc/systemd/system/mnt-backup.mount:
[Unit]
Description=NFS share
[Mount]
What=srv.example.com:/backup/nfs_share
Where=/mnt/backup
Type=nfs4
Options=rw
TimeoutSec=15
/etc/systemd/system/mnt-backup.automount:
[Unit]
Description=NFS share
Requires=network-online.target
BindsTo=openvpn@client.service
After=openvpn@client.service
[Automount]
Where=/mnt/backup
TimeoutIdleSec=60
[Install]
WantedBy=graphical.target
Включаем:
systemctl daemon-reload
systemctl enable --now mnt-backup.automount
Теперь:
при старте системы диск не монтируется сразу;
при первом обращении к /mnt/backup - идет подключение NFS через VPN;
при остановке
openvpn@client.service диск автоматически отмонтируется.#systemd #fstab
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13