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
со всеми этими модулями как зависимостями.
Для более полного контекста:
в service.target
файл состоит только из описания:
#cat .config/systemd/user/service.target
[Unit]
Description = Service global target
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
работает так, как мы ожидаем.
Что бы я хотел
Я хотел бы иметь команду или сценарий, который сообщал бы мне, все ли зависимости цели активированы, только частично или полностью.
Из того, что я пробовал:
systemctl --user status service.target
правильно скажет мне (и выйдет с 0
), если все службы работают, но это не поможет мне отличить «некоторые работают, некоторые не работают» и «все не работают» (в обоих случаях: код выхода 3
, статусное сообщение говорит inactive (dead)
)
systemctl --user list-dependencies service.target
не дает достаточно стабильного вывода для анализа
systemctl --user status
даст мне подробный обзор всех процессов, запущенных пользовательскими сервисами systemd, но я не знаю, как сузить этот список до «только сервисов в service.target»
Вопрос
Каков наиболее стабильный способ получить статус всех служб, от которых зависит цель systemd?
Следует ли нам изменить нашу настройку?
Эта тема недавно обсуждалась в Как создать виртуальную службу systemd для одновременной остановки / запуска нескольких экземпляров?.
Сводка опций:
systemctl status $(systemctl list-dependencies --plain your.target)
Изучая 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 прокомментировал (правильно), что:
ConsistsOf=
в начале требует некоторой формы удаления перед передачей его другой командеЯ вижу следующие преимущества:
В нем перечислены только те элементы, которые объявлены как 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=
показывает пустой список
Я не указывал это в своем первоначальном вопросе, но на самом деле мы используем некоторые дополнительные параметры (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
само устройство указано в list-dependencies
, но не в ConsistsOf
Так что мне все равно пришлось применить некоторую обработку к выходу.
Просто делюсь своим опытом; спасибо за ваш ответ и указания, которые указали мне в правильном направлении.