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


63

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


我为systemd创建了可视化工具。您可以在github.com/ywiyogo/systemd-visual
Yongkie

Answers:


71

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

在示例中,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附带的。我认为也有一些第三方项目在处理它。


感谢您的回答,但是它没有解决问题,只是重申了我的部分问题(我提到我知道一种通过分析systemd的状态数据来做到这一点的方法)。因此,问题是在解决所有依赖性(例如,启动后)之后如何获得启动序列的类似pstree的树。关键链差不多(尽管它是一棵自下而上的树),但是没有列出所有启动的单元。问题中提出了什么:一棵树,列出了直到某个时刻(例如,击中multi-user.target)之前执行的每个单元。
星系

4
systemd-analyze plot > something.svg有目标执行的全部三个(它最接近您想要的)。systemd-analyze点是依赖关系的完整图(这是最正确的表示形式)。这些不是您想要的吗?在绘图中,只需找到目标并查看需要运行的目标即可。相同的依存关系是完全列出的图,如果它可以激发一些图分析工具包并选择要查看其依存关系的图点(点工具具有更多设置)。参见手册页:freedesktop.org/software/systemd/man/systemd-analyze.html --order和类似内容
IBr

1
从手册页:绘制名称以“ avahi-daemon开头”的任何单元的所有依赖关系。: $ systemd-analyze dot 'avahi-daemon.*' | dot -Tsvg > avahi.svg $ eog avahi.svg绘制所有已知目标单元之间的依赖关系:systemd-analyze dot --to-pattern='*.target' --from-pattern='*.target' | dot -Tsvg > targets.svg $ eog targets.svg
IBr

1
IBr,但是不幸的是,这在文本控制台中无法使用。我真的很感谢您在答案上花费的时间(如果您想获取一些数据进行分析是正确的),但是它不能解决原始问题,因此我可以接受。抱歉。
星系

1
好的,没问题。我本人也喜欢命令行工具:)
IBr 2014年

13

可能还没有完全回答你的问题,但与尝试--fuzz选项

systemd-analyze critical-chain --fuzz 1h

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

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

希望这可以帮助


12

不确定我是否正确理解了这个问题,但是以下命令可提供树可视化功能:

sudo systemctl status

并且 :

sudo systemctl list-dependencies 

希望这可以帮助 :)

同样,为其他目的构建systemctl symlinks文件夹树可能很有用:

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。它在用户空间中可以很好地工作,例如与鹦鹉螺一起使用。要做一些配置,请参阅:

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

问题是有关依赖关系解析后经历的所有激活单元systemd的执行树。所以这个答案是一个错过。
星系

也许您的问题很适合功能要求?当然可以。无论如何,我在遇到您的问题后张贴了这个答案,因为它在某种程度上类似于我需要了解的另一个问题,而且我感到缺少一些基本的范例(例如您尝试过但无法使用的东西-那本应该是有助于澄清),特别是对于像我这样的人,在丢失了System V init及其方便的rc.conf文件后仍在挣扎。抱歉,我的回答不合适。虽然不值得一票。
Joel.O

编辑了解决您的问题的方法。希望它能再次有所帮助。
Joel.O

我无法在服务器上的ssh上使用fbi。但是sshfs效果更好。参见编辑
2。– Joel.O
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.