Is there a way to see the execution tree of systemd?

Solution 1:

systemd-analyze is your friend. For example systemd-analyze critical-chain outputs blocking tree of daemons. Mine for example:

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 in example basically holding entire bootup.

If you want to have more detailed view you can render entire execution chain in a svg file. systemd-analyze plot > something.svg outputs entire chain (120+ modules) as progress bars to high-res svg file which show states, that are blocked and another problems.

Finally you have systemd-analyze dot tool which outputs dot file which outputs entire hierarchy: systemd-analyze dot | dot -Tpng -o stuff.png with dot tool you can output it as ps and svg files too.

All of above tools are built-in in systemd-analyze tool which comes by default with systemd in archlinux at least. I think there is some 3rd party projects dealing with it too.

Solution 2:

Not sure I properly understand the question, but there are tree visualizations available with the following commands :

sudo systemctl status

And also :

sudo systemctl list-dependencies 

Hope this helps :)

Also, it might be useful for other purposes to build a tree of the systemctl symlinks folders:

tree /etc/systemd/system

It was actually really useful to figure out old / buggy units that were slowing down my system startup, to disable them afterwards using the systemctl disable command.

EDIT

That said I really agree with the OP that this basic functionality should be given via command-line tools, and not a graphical tool... What if you cannot start X ? How you deal with your svg file then ?

Actually, there is a way. If you cannot use scp (ssh tool) to fetch your file on another computer, fbi might actually help you :)

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

Worked in my TTYs. Just navigate inside the picture with arrows. There are zooming options, to list do fbi -h.

Again I hope this helps. It is available in Archlinux and Ubuntu repos.

EDIT 2 :

fbi doesn't work over ssh. You can do X forwarding like this ssh -Y user@server, but you need a X server running on your remote server.

The best bet here is to use sshfs. It works GREAT in userspace, for instance with nautilus. There's a little configuration to do, see:

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

Solution 3:

May still not fully answering your question but try with --fuzz option

systemd-analyze critical-chain --fuzz 1h

Note you can also specify units to see their critical-chain, so you're not limited to the multi-user.target

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

Hope this helps

Tags:

Linux

Systemd