AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 461454
Accepted
WoJ
WoJ
Asked: 2018-08-09 23:39:03 +0800 CST2018-08-09 23:39:03 +0800 CST 2018-08-09 23:39:03 +0800 CST

如果它是由systemd启动的服务进程,如何检查一个程序?[复制]

  • 772
这个问题在这里已经有了答案:
找到 systemd 单元“拥有”一个正在运行的守护进程 3 个答案
4年前关闭。

是否有记录的方法可以从作为服务本身运行的程序的代码中检查它是否已启动systemd(而不是从交互式登录会话中、从 cron 等启动)?

我当前的解决方案是在.service单元 ( Environment=...) 中定义一个环境变量,并检查它在我的代码中是否存在。但可能有一些直接可用的东西。

systemd services
  • 2 2 个回答
  • 202 Views

2 个回答

  • Voted
  1. Best Answer
    JdeBP
    2018-08-10T03:18:06+08:002018-08-10T03:18:06+08:00

    一个不能。

    systemd 为服务调用的进程提供的一切——它的参数、它的环境、包含它的控制组、它的资源限制、它的打开文件描述符——也可以并且由其他服务管理器完成。此外,没有共同的约定来识别哪些服务管理器正在管理服务。没有常规的环境变量,也没有其他标记。

    错误的机制

    您可能正在考虑检查父进程的可执行名称。这是一个非首发,原因在https://unix.stackexchange.com/a/196252/5132中阐述。父进程(用于系统范围的服务)的可执行程序映像的名称将/sbin/init在 Debian Linux 操作系统上,因为 Debian 的约定是它是实际进程 1 程序映像文件的替代样式符号链接,并且initramfs中的/init程序只需要知道那个名字。

    你可能会想,尽管我刚刚写了,控制组是一个系统标记。他们不是。这是一个由完全不同的服务管理器管理的服务进程的控制组树,service-manager来自 nosh 工具集:

    % systemd-cgls /system.slice/service-manager.service/[email protected]
    控制组/system.slice/service-manager.service/[email protected]:
    └─[email protected]
      └─1433 tinydns
    %
    

    该tinydns程序在 中找到一个控制组/proc/self/cgroup,没有理由假设 systemd 设置了该控制组。它实际上是由move-to-control-group实用程序设置的:

    % 猫 /var/local/sv/[email protected]/service/run
    #!/bin/nosh
    #运行从./[email protected]生成的文件
    #DNS/UDP 套接字在 127.53.0.1
    udp-socket-listen --systemd-compatibility --combine4and6 127.53.0.1 域
    移动到控制组“../[email protected]/[email protected]”
    环境目录
    enuidgid -- tinydns -d
    setlogin -- tinydns -d
    硬限制 -d 3000000
    softlimit -d 硬
    。/服务
    %
    

    没有其他进程状态更改是 systemd 独有的。环境变量可以用setenv(链加载工具) userenv, machineenv, 或export(链加载工具), 资源限制用softlimit, ulimit(链加载工具), 或s6-softlimit, 打开文件描述符用redirfdor fdredir, 命名空间用unshare, 调度优先级用rtprio或chrt, NUMA 策略与numactl; 等等。

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

    概念错误

    还有一个缺陷是您要排除由cron. 这里的概念缺陷是它cron是一个服务,它产生的进程是在该服务的上下文中运行的。由服务中的进程产生的进程和由其他服务中的某个其他服务进程产生的进程之间没有神奇的区别,这使得前者在某种程度上与后者区分开来。croncron

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

    进一步阅读

    • https://unix.stackexchange.com/a/398951/5132
    • https://unix.stackexchange.com/a/187540/5132
    • 如何获取控制终端的真实姓名?
    • 工具集:
      • s6。劳伦特·伯科特。skarnet.org。
      • 执行线。劳伦特·伯科特。skarnet.org。
      • 乔纳森·德博因·波拉德 (2018)。诺什。 软件。
    • 参考手册:
      • export. 劳伦特·伯科特。 执行线。skarnet.org。
      • redirfd. 劳伦特·伯科特。 执行线。skarnet.org。
      • s6-softlimit. 劳伦特·伯科特。 s6。skarnet.org。
      • 芯片。运行。格里特佩佩。smarden.org。
      • 乔纳森·德博因·波拉德 (2018)。service-manager. 小吃指南。软件。
      • 乔纳森·德博因·波拉德 (2018)。move-to-control-group. 小吃指南。软件。
      • 乔纳森·德博因·波拉德 (2018)。setenv. 小吃指南。软件。
      • 乔纳森·德博因·波拉德 (2018)。softlimit. 小吃指南。软件。
      • 乔纳森·德博因·波拉德 (2018)。ulimit. 小吃指南。软件。
      • 乔纳森·德博因·波拉德 (2018)。fdredir. 小吃指南。软件。
      • 乔纳森·德博因·波拉德 (2018)。unshare. 小吃指南。软件。
      • 乔纳森·德博因·波拉德 (2018)。setlogin. 小吃指南。软件。
    • 2
  2. perror
    2018-08-09T23:57:44+08:002018-08-09T23:57:44+08:00

    我想您可以使用以下命令:

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

    • 0

相关问题

  • 将默认编辑器更改为 vim for _ sudo systemctl edit [unit-file] _

  • systemd:如何在服务启动时运行脚本,而不编辑服务定义

  • 使用 systemd 看门狗支持重新启动应用程序

  • 来自 `service | 的意外结果 grep`

  • 使用键盘快捷键启动/停止 systemd 服务 [关闭]

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve