有没有记录的方法来检查,从作为服务本身运行的程序的代码中systemd
,它是由(而不是从交互式登录会话中、从 cron 等启动的)启动的?
.service
我当前的解决方案是在单元 ( )中定义一个环境变量Environment=...
并检查它在我的代码中是否存在。但可能有直接可用的东西。
答案1
一个人不能。
systemd 为服务调用的进程提供的所有功能(其参数、环境、包含它的控制组、资源限制、打开的文件描述符)都可以由其他服务管理器完成。此外,没有用于识别哪个服务管理器正在管理服务的共享约定;没有常规环境变量,也没有其他标记。
错误的机制
您可能正在考虑检查父进程的可执行文件名称。这是不可能的,原因在https://unix.stackexchange.com/a/196252/5132。父进程的可执行程序映像的名称(用于系统范围的服务)将/sbin/init
在 Debian Linux 操作系统上,因为 Debian 的惯例是,它是实际进程 1 程序映像文件的替代样式符号链接,并且initramfs 中的程序/init
只需要知道该名称即可。
您可能会想,不管我刚刚写了什么,控制组都是一个 systemd 标记。他们不是。这是由完全不同的服务管理器管理的服务进程的控制组树,service-manager
来自 nosh 工具集:
%systemd-cgls /system.slice/service-manager.service/[电子邮件受保护] 控制组/system.slice/service-manager.service/[电子邮件受保护]: └─[电子邮件受保护] └─1433tinydns %
该tinydns
程序在 中找到了一个控制组/proc/self/cgroup
,因此没有理由假设 systemd 设置了该控制组。它实际上是由实用程序设置的move-to-control-group
:
%猫/var/local/sv/[电子邮件受保护]/服务/运行 #!/bin/nosh #运行./生成的文件[电子邮件受保护] #127.53.0.1 上的 DNS/UDP 套接字 udp-socket-listen --systemd-compatibility --combine4and6 127.53.0.1 域 移动到控制组“../[电子邮件受保护]/[电子邮件受保护]” envdir 环境 envuidgid——tinydns-d setlogin——tinydns-d 硬限制-d 3000000 软限制 -d 硬 。/服务 %
没有其他进程状态更改是 systemd 所独有的。可以使用setenv
(链式加载工具)userenv
、machineenv
、 或(链式加载工具)设置环境变量,使用, (链式加载工具)或export
来设置资源限制,使用或打开文件描述符,使用 命名空间,使用 调度优先级或者,NUMA 策略;等等。softlimit
ulimit
s6-softlimit
redirfd
fdredir
unshare
rtprio
chrt
numactl
LISTEN_FDS
从上面可以看出, systemd 并不是该协议的唯一发言人。同样,这只是在程序开始时填充并链接的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
- 如何获取控制终端的真实姓名?
- 工具集:
- 参考手册:
export
。洛朗·贝尔科特. 执行。 skarnet.org。redirfd
。洛朗·贝尔科特. 执行。 skarnet.org。s6-softlimit
。洛朗·贝尔科特. s6。 skarnet.org。- CHPST. runit. Gerrit Pape. smarden.org。
- 乔纳森·德博因·波拉德 (2018)。
service-manager
。 小吃指南。软件。 - 乔纳森·德博因·波拉德 (2018)。
move-to-control-group
。 小吃指南。软件。 - 乔纳森·德博因·波拉德 (2018)。
setenv
。 小吃指南。软件。 - 乔纳森·德博因·波拉德 (2018)。
softlimit
。 小吃指南。软件。 - 乔纳森·德博因·波拉德 (2018)。
ulimit
。 小吃指南。软件。 - 乔纳森·德博因·波拉德 (2018)。
fdredir
。 小吃指南。软件。 - 乔纳森·德博因·波拉德 (2018)。
unshare
。 小吃指南。软件。 - 乔纳森·德博因·波拉德 (2018)。
setlogin
。 小吃指南。软件。
答案2
我想你可以使用以下命令:
#> systemctl list-unit-files --state=enabled
cups.path enabled
accounts-daemon.service enabled
anacron.service enabled
apparmor.service enabled
atd.service enabled
[email protected] enabled
avahi-daemon.service enabled
...
其本身systemctl list-unit-files
列出了所有可能启动服务的已安装单元文件。标记为 的那些enabled
是在您键入命令时启动的。