Как можно проверить в своей программе, что это служебный процесс, запущенный systemd? [дубликат]

-2
09.08.2018, 12:50
2 ответа

Нельзя.

Все, что systemd предоставляет процессу, вызываемому для службы, — его аргументы, его окружение, управляющую группу (s ), содержащую его, его ограничения ресурсов, его дескрипторы открытых файлов — может быть и делается другими сервис-менеджеры тоже. Более того, не существует общего соглашения для определения того, какой менеджер служб управляет службами; никаких обычных переменных среды или других маркеров.

Ошибочные механизмы

Возможно, вы подумали о проверке имени исполняемого файла родительского процесса. Это не -стартер по причинам, изложенным в https://unix.stackexchange.com/a/196252/5132. Имя исполняемого образа программы родительского процесса (для системных -общесистемных служб )будет /sbin/initв операционных системах Debian Linux, поскольку в Debian принято соглашение о том, что это символический стиль альтернатив -ссылку на фактический файл образа программы процесса 1, а программе /initв initramfs нужно знать только это имя.

Вы можете подумать, что, несмотря на то, что я только что написал, контрольные группы — это маркер systemd. Они не. Вот дерево контрольных групп сервисного процесса, управляемого совершенно другим сервисным менеджером, service-managerиз набора инструментов nosh:

% systemd-cgls /system.slice/service-manager.service/tinydns@.service
Control group /system.slice/service-manager.service/tinydns@.service:
└─tinydns@127.53.0.1.service
  └─1433 tinydns
%

Программа tinydns, найдя контрольную группу в /proc/self/cgroup, не имеет оснований предполагать, что systemd создала эту контрольную группу. На самом деле он был установлен утилитой move-to-control-group:

% cat /var/local/sv/tinydns@127.53.0.1/service/run
#!/bin/nosh
#Run file generated from./tinydns@.socket
#DNS/UDP socket on 127.53.0.1
udp-socket-listen --systemd-compatibility --combine4and6 127.53.0.1 domain
move-to-control-group "../tinydns@.service/tinydns@127.53.0.1.service"
envdir env
envuidgid -- tinydns-d
setlogin -- tinydns-d
hardlimit -d 3000000
softlimit -d hard
./service
% 

Никакие другие изменения состояния процесса не являются уникальными для systemd. Переменные среды можно установить с помощьюsetenv(цепочка -инструмент загрузки )userenv, machineenvилиexport(цепочка -инструмент загрузки ), ограничения ресурсов с помощью softlimit,ulimit(цепочка -инструмент загрузки )или s6-softlimit, дескрипторы открытых файлов с redirfdили fdredir, пространства имен с unshare, приоритеты планирования с rtprioили chrt, политика NUMA с numactl; и так далее.

systemd не единственный динамик протокола LISTEN_FDS, как видно из вышесказанного. INVOCATION_IDтакже является просто упражнением по заполнению env/INVOCATION_IDв начале программы runи цепочке через envdir. Ни один из них не является надежным маркером.

Концептуальные ошибки

Также существует недостаток, заключающийся в том, что вы хотите исключить процессы, запущенные cron. Концептуальная ошибка здесь заключается в том, что cron— это служба, и порождаемые ею процессы выполняются в контексте этой службы . Не существует никакого волшебного различия между процессом, порожденным cronпроцессом в cronслужбе, и процессом, порожденным каким-то другим сервисным процессом в какой-то другой службе, что делает первый каким-то образом отличимым от второго.

Избавьтесь от этой концептуальной ошибки, и появится ответ. Демоны отличаются тем, что (POSIX )сеансы, к которым они принадлежат, не имеют управляющих терминалов, и у них нет других ассоциаций (с именем, установленным setlogin, через механизм сеанса входа в пространство пользователя -systemd в различные контексты безопасности )с любым сеансом входа. Не существует переносимого прямого способа запросить управляющий терминал сеанса, но отметив, что открытие /dev/ttyне удалось, можно воспользоваться косвенным путем. Обратите внимание, что некоторые внешне многообещающие функции библиотеки C на практике ненадежны.

Дополнительная литература

  • https://unix.stackexchange.com/a/398951/5132
  • https://unix.stackexchange.com/a/187540/5132
  • Как узнать настоящее имя управляющего терминала?
  • наборы инструментов :
    • с6 . Лоран Берко. skarnet.org.
    • выполнить . Лоран Берко. skarnet.org.
    • Джонатан де Бойн Поллард (2018 ).нош . Программное обеспечение.
  • справочники :
    • export. Лоран Берко. выполнить . skarnet.org.
    • redirfd. Лоран Берко. выполнить . skarnet.org.
    • s6-softlimit. Лоран Берко. с6 . skarnet.org.
    • чпст . запустить его. Геррит Пейп. www.smarden.org.
    • Джонатан де Бойн Поллард (2018 ).service-manager. Направляющая ноша . Программное обеспечение.
    • Джонатан де Бойн Поллард (2018 ).move-to-control-group. Направляющая ноша . Программное обеспечение.
    • Джонатан де Бойн Поллард (2018 ).setenv. Направляющая ноша . Программное обеспечение.
    • Джонатан де Бойн Поллард (2018 ).softlimit. Направляющая ноша . Программное обеспечение.
    • Джонатан де Бойн Поллард (2018 ).ulimit. Направляющая ноша . Программное обеспечение.
    • Джонатан де Бойн Поллард (2018 ).fdredir. Направляющая ноша . Программное обеспечение.
    • Джонатан де Бойн Поллард (2018 ).unshare. Направляющая ноша . Программное обеспечение.
    • Джонатан де Бойн Поллард (2018 ).setlogin. Направляющая ноша . Программное обеспечение.
1
28.01.2020, 05:16

Думаю, вы можете использовать следующую команду:

#> systemctl list-unit-files --state=enabled
cups.path                                  enabled        
accounts-daemon.service                    enabled        
anacron.service                            enabled        
apparmor.service                           enabled        
atd.service                                enabled        
autovt@.service                            enabled        
avahi-daemon.service                       enabled        
...

Сам по себе systemctl list-unit-filesсписок всех установленных юнит-файлов, которые могут запускать службу. Те, которые помечены как enabled, запускаются в момент ввода команды.

0
28.01.2020, 05:16

Теги

Похожие вопросы