Все, что 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 на практике ненадежны.
export
. Лоран Берко. выполнить . skarnet.org.redirfd
. Лоран Берко. выполнить . skarnet.org. s6-softlimit
. Лоран Берко. с6 . skarnet.org. service-manager
. Направляющая ноша . Программное обеспечение. move-to-control-group
. Направляющая ноша . Программное обеспечение. setenv
. Направляющая ноша . Программное обеспечение. softlimit
. Направляющая ноша . Программное обеспечение. ulimit
. Направляющая ноша . Программное обеспечение. fdredir
. Направляющая ноша . Программное обеспечение. unshare
. Направляющая ноша . Программное обеспечение. setlogin
. Направляющая ноша . Программное обеспечение. Думаю, вы можете использовать следующую команду:
#> 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
, запускаются в момент ввода команды.