从进程名称识别 systemd 单元文件

Zee*_*e99 6 linux systemd

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

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

我正在寻找一种根据任何守护程序名称获取单元名称的方法。

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

使用systemctl --all statusI 可以得到所有东西......但只是简单的 grep 进入那个烂摊子是不会得到单位名称的。

use*_*686 8

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

$ ps -e -o pid,unit,cmd
    PID 单元 CMD
      1 init.scope /usr/lib/systemd/systemd
    315 postfix.service tlsmgr -l -t unix -u
   3057 cronie.service /usr/bin/CROND -n
   3107 galed.service /usr/bin/galed
   3182 getty@tty1.service /sbin/agetty --noclear tty1 linux
  29171 postfix.service /usr/lib/postfix/bin/master -w
  32758 postfix.service qmgr -l -t unix -u

$ ps -o 单位= 32758
后缀服务

$ ps -o 单位= -C tlsmgr
后缀服务

$ systemctl status $(pidof Pickup)
? postfix.service - Postfix 邮件传输代理
   已加载:已加载(/usr/lib/systemd/system/postfix.service;已启用;供应商预设:已禁用)
   Active:自 EEST 星期日 2016-03-27 17:24:24 起处于活动状态(正在运行);2 周 2 天前
 主PID:29171(主)
    任务:4(限制:512)
   C组:/system.slice/postfix.service
           ?? 第315话
           ?? 8720 拾音器 -l -t unix -u
           ??29171 /usr/lib/postfix/bin/master -w
           ??32758 qmgr -l -t unix -u

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

  • ps -o unit= -C tlsmgr 正是我要找的。我知道 systemctl status $(pidof Pickup) 但该输出几乎不可能解析以获取单元名称 (postfix.service)。谢谢! (2认同)