TGViewer
BashTex | Linux BashTex | Linux @bash_tex · 2.51K subscribers
Post #239 1.28K
Автообновление и откат systemd-сервисов с логированием

Когда сервис критичен, обновление "в лоб" - плохая идея. Ошибка в новом бинаре или конфиге может повалить всё. Решение? Безопасное автообновление с возможностью мгновенного отката и логированием. Всё на Bash + systemd.

🌟 Как это работает?

1. Скрипт обновляет бинарь или конфиг.
2. Перезапускает systemd-сервис.
3. Проверяет статус через systemctl и/или пользовательские тесты.
4. В случае сбоя - откатывает всё.
5. Логирует действия для аудита.


📱 Пример скрипта:


#!/bin/bash

SERVICE="myapp.service"
BIN_DIR="/opt/myapp"
NEW_BIN="/tmp/myapp-new"
BACKUP="$BIN_DIR/myapp.bak"
MAIN_BIN="$BIN_DIR/myapp"
LOG="/var/log/myapp_updater.log"

log() {
echo "[$(date +'%F %T')] $1" >> "$LOG"
}

# Резервная копия текущего бинарника
cp "$MAIN_BIN" "$BACKUP" && log "Создана резервная копия."

# Копируем новый бинарь
cp "$NEW_BIN" "$MAIN_BIN" && chmod +x "$MAIN_BIN" && log "Установлен новый бинарь."

# Перезапускаем сервис
systemctl restart "$SERVICE"
sleep 5

# Проверка статуса
if ! systemctl is-active --quiet "$SERVICE"; then
log "Ошибка! Сервис не запустился. Выполняется откат."
cp "$BACKUP" "$MAIN_BIN"
systemctl restart "$SERVICE"
if systemctl is-active --quiet "$SERVICE"; then
log "Откат успешен."
else
log "Откат не удался. Требуется ручное вмешательство!"
fi
else
log "Сервис успешно обновлён и запущен."
rm -f "$BACKUP"
fi


▪️ Подключение как systemd-timer. Чтобы запускать обновление по расписанию:


# /etc/systemd/system/myapp-updater.timer
[Unit]
Description=Update myapp binary daily

[Timer]
OnCalendar=daily
Persistent=true

[Install]
WantedBy=timers.target



# /etc/systemd/system/myapp-updater.service
[Unit]
Description=Update myapp safely

[Service]
ExecStart=/usr/local/bin/myapp_updater.sh



sudo systemctl daemon-reload
sudo systemctl enable --now myapp-updater.timer


🌟 Что можно улучшить:

1. Добавить интеграцию с Git или rsync для получения обновлений.
2. Хэш-сравнение файлов (md5sum) перед установкой.
3. Юнит-тест на бинарь/конфиг после замены.


BashTex 📱 #bash #utils
  • 👍 12
  • 🔥 2
More from @bash_tex
  1. Oct 13, 2026openat2(): как Linux защищает от выхода за пределы каталога Допустим, приложение должно чи…
  2. Oct 12, 2026xargs против while read: где быстрее и безопаснее Обе конструкции позволяют обработать спи…
  3. Oct 9, 2026BashTex 📱 #мем
  4. Oct 8, 2026Bridge FDB - как Linux bridge узнаёт, где находится MAC Linux bridge не знает заранее, за…
  5. Oct 7, 2026/dev/tcp - сетевое соединение средствами Bash В Bash есть малоизвестная возможность работа…
  6. Oct 6, 2026Ephemeral ports - почему заканчиваются исходящие TCP-порты Когда приложение устанавливает…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →