Назад | Перейти на главную страницу

systemd: получить статус дополнительных заданий цели

TL; DR

Как мне получить представление о состоянии всех служб на цели?

что-то вроде :

# obviously, 'systemctl status' does not have this output :
$ systemctl --user status service.target
service.target: inactive (dead)
├── backend.service:  active
├── db.service: active
├── frontend.service: active
└── scheduler.service: inactive (dead)

Контекст

У нас есть несколько модулей systemd, которые являются частью более глобального сервиса, поэтому мы написали service.target со всеми этими модулями как зависимостями.

Для более полного контекста:

  1. единицы и цель на самом деле являются пользовательскими и целевыми единицами
  2. в service.targetфайл состоит только из описания:

    #cat .config/systemd/user/service.target
    [Unit]
    Description = Service global target
    
  3. service.targetзависимости перечислены в файловой системе:

    $ tree .config/systemd/user
    ├── backend.service
    ├── db.service
    ├── frontend.service
    ├── scheduler.service
    ├── service.target
    └── service.target.requires
       ├── backend.service -> ../backend.service
       ├── db.service -> ../db.service
       ├── frontend.service -> ../frontend.service
       └── scheduler.service -> ../scheduler.service
    

При такой настройке systemctl --user start service.target и systemctm --user stop service.target работает так, как мы ожидаем.

Что бы я хотел

Я хотел бы иметь команду или сценарий, который сообщал бы мне, все ли зависимости цели активированы, только частично или полностью.

Из того, что я пробовал:

Вопрос

Каков наиболее стабильный способ получить статус всех служб, от которых зависит цель systemd?

Следует ли нам изменить нашу настройку?

Изучая systemd, я обнаружил, что следующая команда дает мне более прямой список служб, которые я хочу проверить:

systemctl --user show --property=ConsistsOf your.target

Дополнительным преимуществом является возврат "" по базовым услугам:

$ systemctl --user show --property=ConsistsOf service.target
ConsistsOf=backend.service db.service frontend.service scheduler.service
$ systemctl --user show --property=ConsistsOf backend.service
ConsistsOf=

@MarkStosberg прокомментировал (правильно), что:

  1. Это не по алфавиту
  2. В ConsistsOf= в начале требует некоторой формы удаления перед передачей его другой команде

Я вижу следующие преимущества:

  1. В нем перечислены только те элементы, которые объявлены как PartOf моей цели:
    например, когда я использую list-dependencies на db.service, Я вижу :

    $ systemctl --user list-dependencies --plain db.service
    db.service
      -.slice
      basic.target
      paths.target
      sockets.target
      dirmngr.socket
      gpg-agent-browser.socket
      gpg-agent-extra.socket
      gpg-agent-ssh.socket
      gpg-agent.socket
      timers.target
    

    (что технически верно, но не имеет отношения к моему варианту использования), а:

    $ systemctl --user show --property=ConsistsOf db.service
    ConsistsOf=
    

    показывает пустой список

  2. Я не указывал это в своем первоначальном вопросе, но на самом деле мы используем некоторые дополнительные параметры (backend.service действительно может быть backend@p0.service или backend@p1.service или ...) При использовании list-dependencies на нашу цель, так или иначе, backend@p0.service попадает в список дважды:

    $ systemctl --user list-dependencies --plain service.target
    service.target
      backend@p0.service
      backend@p0.service
      db.service
      frontend.service
      scheduler.service
    
  3. само устройство указано в list-dependencies, но не в ConsistsOf

Так что мне все равно пришлось применить некоторую обработку к выходу.

Просто делюсь своим опытом; спасибо за ваш ответ и указания, которые указали мне в правильном направлении.