根据进程名称识别 systemd 单元文件

根据进程名称识别 systemd 单元文件

对于某些服务单元文件,单元文件名与守护进程的名称不对应。

例如 Postfix:调用单元文件,postfix.service但启动的底层守护进程被命名为master(主守护进程)和qmgrtlsmgr辅助守护进程)。

我正在寻找一种基于任何守护进程名称来获取单元名称的方法。

使用systemctl status postfix(作为示例),我可以看到它显示了它所产生的进程。

使用systemctl --all status我可以获得所有内容....但仅在那堆乱糟糟的东西中进行简单的 grep 并不能找回单位名称。

答案1

libsystemdAPI 函数是sd_pid_get_unit(…)。从命令行,您可以使用psUNIT 列(如果它是在 libsystemd 支持下编译的):

$ ps -e -o pid,单位,cmd
    PID 单元命令
      1 init.scope /usr/lib/systemd/systemd
    315 postfix.service tlsmgr -l -t unix -u
   3057 cronie.service /usr/bin/CROND -n
   3107 galed.服务 /usr/bin/galed
   3182[电子邮件保护]              /sbin/agetty --noclear tty1 linux
  29171 postfix.服务 /usr/lib/postfix/bin/master -w
  32758 postfix.service qmgr-l-t unix-u

$ ps -o 单位= 32758
postfix 服务

$ ps -o 单位= -C tlsmgr
postfix 服务

$ systemctl 状态 $(pidof pickup)
● postfix.service - Postfix 邮件传输代理
   已加载:已加载(/usr/lib/systemd/system/postfix.service;已启用;供应商预设:已禁用)
   活跃:自 2016-03-27 17:24:24 EEST 以来一直处于活跃状态(运行);2 周 2 天前
 主 PID:29171(主)
    任务:4(限制:512)
   CGroup:/system.slice/postfix.service
           315 tlsmgr-l-t unix-u
           ─ 8720 拾音器-l -t unix -u
           ─29171 /usr/lib/postfix/bin/master -w
           └─32758 qmgr-l-t unix-u

$ grep :name=systemd: /proc/$(pidof pickup)/cgroup
1:名称=systemd:/system.slice/postfix.service
#不要依赖这个,因为 cgroup 结构将在未来几个月内发生变化

相关内容