DEVOPSITSEC Telegram 1610
🧠 Хитрая DevOps-задача — неожиданное поведение systemd и зависимостей сервисов

Задача:

У вас есть два systemd-сервиса: backend.service и database.service.

В юните backend.service вы прописали:


[Unit]
Requires=database.service
After=database.service


Но после перезагрузки системы backend.service запускается, хотя `database.service` не стартовал (из-за ошибки).

Вопрос:
Почему backend не дождался базы данных и не остановился вместе с ней, несмотря на Requires=database.service?

Подсказка: это не баг systemd. Это особенность.

Правильный ответ:
Потому что Requires и After действуют только при запуске backend вручную или через systemctl, но не при автоматическом старте на boot, если backend стартует по WantedBy=multi-user.target.

🔍 Разбор

- Requires=database.service говорит: если запускается backend, то systemd должен также запустить database.
Но если database не стартует — backend всё равно может попытаться запуститься.

- After=database.service определяет порядок запуска, но не делает зависимость "жёсткой".

- При старте системы systemd может параллельно запускать сервисы, если backend привязан напрямую к multi-user.target и не указан как зависимость в database.service.

Как правильно:

Чтобы backend не запускался без базы:

1. Убедитесь, что database.service:
- прописан как WantedBy=multi-user.target
- и запускается первым

2. Убедитесь, что backend.service содержит:


[Unit]
Requires=database.service
After=database.service
StartLimitIntervalSec=0


3. И желательно добавить `PartOf=database.service`, если хотите, чтобы backend выключался вместе с базой.

⚠️ Вывод:

- В systemd порядок и тип зависимостей — неочевидны.
- Даже Requires не гарантирует, что другой сервис успешно работает — только то, что systemd *попробует* его запустить.
- Хотите быть уверены — используйте Condition*, ExecStartPre с проверками или HealthCheck в Docker/K8s.

📌 systemd — мощный, но коварный. Не доверяй поверхностной логике — тестируй руками каждую зависимость.
14👍9🥰3🤔1



tgoop.com/DevOPSitsec/1610
Create:
Last Update:

🧠 Хитрая DevOps-задача — неожиданное поведение systemd и зависимостей сервисов

Задача:

У вас есть два systemd-сервиса: backend.service и database.service.

В юните backend.service вы прописали:


[Unit]
Requires=database.service
After=database.service


Но после перезагрузки системы backend.service запускается, хотя `database.service` не стартовал (из-за ошибки).

Вопрос:
Почему backend не дождался базы данных и не остановился вместе с ней, несмотря на Requires=database.service?

Подсказка: это не баг systemd. Это особенность.

Правильный ответ:
Потому что Requires и After действуют только при запуске backend вручную или через systemctl, но не при автоматическом старте на boot, если backend стартует по WantedBy=multi-user.target.

🔍 Разбор

- Requires=database.service говорит: если запускается backend, то systemd должен также запустить database.
Но если database не стартует — backend всё равно может попытаться запуститься.

- After=database.service определяет порядок запуска, но не делает зависимость "жёсткой".

- При старте системы systemd может параллельно запускать сервисы, если backend привязан напрямую к multi-user.target и не указан как зависимость в database.service.

Как правильно:

Чтобы backend не запускался без базы:

1. Убедитесь, что database.service:
- прописан как WantedBy=multi-user.target
- и запускается первым

2. Убедитесь, что backend.service содержит:


[Unit]
Requires=database.service
After=database.service
StartLimitIntervalSec=0


3. И желательно добавить `PartOf=database.service`, если хотите, чтобы backend выключался вместе с базой.

⚠️ Вывод:

- В systemd порядок и тип зависимостей — неочевидны.
- Даже Requires не гарантирует, что другой сервис успешно работает — только то, что systemd *попробует* его запустить.
- Хотите быть уверены — используйте Condition*, ExecStartPre с проверками или HealthCheck в Docker/K8s.

📌 systemd — мощный, но коварный. Не доверяй поверхностной логике — тестируй руками каждую зависимость.

BY DevOps


Share with your friend now:
tgoop.com/DevOPSitsec/1610

View MORE
Open in Telegram


Telegram News

Date: |

More>> How to Create a Private or Public Channel on Telegram? Among the requests, the Brazilian electoral Court wanted to know if they could obtain data on the origins of malicious content posted on the platform. According to the TSE, this would enable the authorities to track false content and identify the user responsible for publishing it in the first place. The Standard Channel
from us


Telegram DevOps
FROM American