有没有办法查看 systemd 的执行树?

有没有办法查看 systemd 的执行树?

我的问题的意思是:有没有办法转储有序列表(就像 pstree 对进程所做的那样)来查看 systemd 如何执行提供的单元集,即在解决依赖关系并将作业排队等待执行之后的树?我知道您可以通过分析 systemd 状态数据来做到这一点,但是有没有一种快速的方法可以查看这样的树?它将对故障调查大有帮助(例如,如果您发现启动过程卡在某个单元上,您将能够精确定位大致位置以进行更深入的调查。

答案1

systemd-analyze是你的朋友。例如systemd-analyze critical-chain输出守护进程的阻塞树。例如我的:

graphical.target @20.211s
└─multi-user.target @20.211s
  └─nginx.service @19.348s +862ms
    └─network.target @19.347s
      └─NetworkManager.service @10.315s +9.031s
        └─basic.target @10.312s
          └─timers.target @10.311s
            └─systemd-tmpfiles-clean.timer @10.311s
              └─sysinit.target @10.295s
                └─systemd-update-utmp.service @10.167s +127ms
                  └─systemd-tmpfiles-setup.service @10.124s +41ms
                    └─local-fs.target @10.097s
                      └─home-entd-Downloads.mount @10.093s +2ms
                        └─home.mount @9.326s +672ms
                          └─[email protected] @8.472s +696ms
                            └─dev-sda6.device @8.471s

示例中的 NetworkManager 基本上控制整个启动过程。

如果您想要更详细的视图,您可以在 svg 文件中呈现整个执行链。 systemd-analyze plot > something.svg将整个链(120 多个模块)作为进度条输出到高分辨率 svg 文件,显示状态、被阻止的情况和其他问题。

最后,您有systemd-analyze dot一个输出点文件的工具,它可以输出整个层次结构: systemd-analyze dot | dot -Tpng -o stuff.png 使用点工具,您也可以将其输出为 ps 和 svg 文件。

以上所有工具都内置于 systemd-analyze 工具中,该工具至少在 archlinux 中默认随 systemd 提供。我认为也有一些第三方项目在处理它。

答案2

不确定我是否正确理解了这个问题,但是可以使用以下命令实现树形可视化:

sudo systemctl status

并且 :

sudo systemctl list-dependencies 

希望这可以帮助 :)

此外,构建 systemctl 符号链接文件夹树可能还用于其他目的:

tree /etc/systemd/system

找出那些减慢系统启动速度的旧的/有缺陷的单元,然后使用命令禁用它们实际上非常有用systemctl disable

编辑

话虽如此,我非常同意 OP 的观点,即这个基本功能应该通过命令行工具而不是图形工具来提供...如果你无法启动 X 怎么办?那么你如何处理你的 svg 文件?

其实,有一种方法。如果你不能使用scp(ssh 工具)在另一台计算机上获取文件,这种方法fbi实际上可能会对你有所帮助 :)

sudo systemd-analyze plot > /home/user/startup.svg
fbi /home/user/startup.svg

在我的 TTY 中工作。只需使用箭头在图片内导航即可。有缩放选项,列出要执行的操作fbi -h

再次希望这会有所帮助。它在 Archlinux 和 Ubuntu 存储库中可用。

编辑2:

fbi无法通过 ssh 工作。您可以像这样进行 X 转发ssh -Y user@server,但您需要在远程服务器上运行 X 服务器。

这里最好的选择是使用sshfs。它在用户空间中效果很好,例如使用 nautilus。需要进行一些配置,请参阅:

sudo vim /etc/fuse.conf #type a, uncomment the user_allow_other line and ESC :wq
sudo mkdir /mnt/yourmountingdir
sudo chown user:user /mnt/yourmountingdir
sshfs [email protected]:/home/user /mnt/yourmountingdir/ -o allow_other #Asks for host trusting and password
sudo fusermount -u /mnt/yourmountingdir/ #To disconnect and unmount

答案3

可能仍然不能完全回答你的问题,但尝试--fuzz选择

systemd-analyze critical-chain --fuzz 1h

注意您还可以指定单位s看到他们的关键链,所以你不仅限于多用户目标

systemd-analyze critical-chain network.target local-fs.target

希望这可以帮助

相关内容