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

gal*_*axy 89 linux systemd

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

IBr*_*IBr 111

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
                          ??systemd-fsck@dev-sda6.service @8.472s +696ms
                            ??dev-sda6.device @8.471s
Run Code Online (Sandbox Code Playgroud)

示例中的 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 一起提供。我认为也有一些 3rd 方项目在处理它。

  • `systemd-analyze plot > something.svg` 是完整的三个目标执行(它最接近你想要的)。systemd-analyze dot 是完整的依赖关系图(这是最正确的表示)。这些不是你想要的吗?在情节中只需找到目标并查看它也需要运行。相同的依赖关系是完全列出的图形,如果它非常启动一些图形分析工具包并选择您想要查看依赖关系的图形点(点工具有更多设置)。参见手册页:http://www.freedesktop.org/software/systemd/man/systemd-analyze.html --order 和类似的 (4认同)
  • IBr,但不幸的是,这在文本控制台中无法使用。我非常感谢您在答案上花费的时间(如果您想获得一些数据进行分析,这是正确的),但它没有解决原始问题,因此我可以接受。对不起。 (2认同)

Joe*_*l.O 27

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

sudo systemctl status
Run Code Online (Sandbox Code Playgroud)

并且 :

sudo systemctl list-dependencies 
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助 :)

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

tree /etc/systemd/system
Run Code Online (Sandbox Code Playgroud)

找出使我的系统启动变慢的旧/有问题的单元实际上非常有用,然后使用systemctl disable命令禁用它们。

编辑

这就是说我真的同意 OP 应该通过命令行工具而不是图形工具来提供这个基本功能......如果你不能启动 X 怎么办?你如何处理你的 svg 文件呢?

其实是有办法的。如果您无法使用scp(ssh 工具)在另一台计算机上获取您的文件,fbi实际上可能对您有所帮助:)

sudo systemd-analyze plot > /home/user/startup.svg
fbi /home/user/startup.svg
Run Code Online (Sandbox Code Playgroud)

在我的 TTY 工作。只需使用箭头在图片内导航即可。有缩放选项,列出 do 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 user@remotemachine.com:/home/user /mnt/yourmountingdir/ -o allow_other #Asks for host trusting and password
sudo fusermount -u /mnt/yourmountingdir/ #To disconnect and unmount
Run Code Online (Sandbox Code Playgroud)


小智 14

可能仍然无法完全回答您的问题,但请尝试--fuzz选择

systemd-analyze critical-chain --fuzz 1h
Run Code Online (Sandbox Code Playgroud)

请注意,您也可以指定单位小号看到自己的关键链,这样你就不会局限于multi-user.target

systemd-analyze critical-chain network.target local-fs.target
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助