一个人不能。

一个人不能。

有没有记录的方法来检查,从作为服务本身运行的程序的代码中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(链式加载工具)userenvmachineenv、 或(链式加载工具)设置环境变量,使用, (链式加载工具)或export来设置资源限制,使用或打开文件描述符,使用 命名空间,使用 调度优先级或者,NUMA 策略;等等。softlimitulimits6-softlimitredirfdfdredirunsharertpriochrtnumactl

LISTEN_FDS从上面可以看出, systemd 并不是该协议的唯一发言人。同样,这只是在程序开始时填充并链接的INVOCATION_ID练习。这些作为标记都不可靠。env/INVOCATION_IDrunenvdir

概念错误

还有一个缺陷,您希望排除由 启动的进程cron。这里的概念缺陷是,这cron是一个服务,以及它产生的进程正在该服务的上下文中运行。有cron服务中的进程生成的进程cron与其他服务中的其他服务进程生成的进程之间存在神奇的区别,这使得前者在某种程度上与后者有所区别。

摆脱这个概念性错误,答案就会出现。守护进程的区别在于它们所属的 (POSIX) 会话没有控制终端,并且它们没有其他与任何登录会话的关联(从由 设定的名称setlogin,通过 systemd 的用户空间登录会话机制,到各种安全上下文)。没有一种可移植的直接方法来查询会话的控制终端是什么,但请注意打开/dev/tty失败是一种可用的间接途径。请注意,一些表面上很有前途的 C 库函数实际上在实践中并不可靠。

进一步阅读

答案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是在您键入命令时启动的。

相关内容