Apakah ada cara untuk melihat pohon eksekusi systemd?

63

Yang saya maksud di bawah pertanyaan adalah: apakah ada cara untuk membuang daftar yang dipesan (seperti pstree lakukan untuk proses) untuk melihat bagaimana systemd mengeksekusi set unit yang disediakan, yaitu pohon setelah dependensi diselesaikan dan pekerjaan antri untuk pelaksanaan ? Saya tahu Anda dapat melakukannya dengan menganalisis data status systemd, tetapi apakah ada cara cepat untuk melihat pohon seperti itu? Ini akan banyak membantu dalam investigasi kegagalan (mis. Jika Anda melihat bahwa proses boot macet pada beberapa unit Anda akan dapat menentukan perkiraan lokasi untuk investigasi lebih dalam Anda.

galaksi
sumber
Saya telah membuat alat visualisasi untuk systemd. Anda dapat memeriksa dan mencoba alat ini di github.com/ywiyogo/systemd-visual
Yongkie

Jawaban:

71

systemd-analyzeadalah temanmu Misalnya systemd-analyze critical-chainkeluaran memblokir pohon daemon. Milik saya misalnya:

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 misalnya pada dasarnya menahan seluruh bootup.

Jika Anda ingin memiliki tampilan yang lebih rinci, Anda dapat membuat seluruh rantai eksekusi dalam file svg. systemd-analyze plot > something.svgmenampilkan seluruh rantai (120+ modul) sebagai bilah kemajuan ke file beresolusi tinggi yang menunjukkan status, yang diblokir dan masalah lainnya.

Akhirnya Anda memiliki systemd-analyze dotalat yang menghasilkan file dot yang menghasilkan seluruh hierarki: systemd-analyze dot | dot -Tpng -o stuff.png dengan alat dot Anda dapat menampilkannya sebagai file ps dan svg juga.

Semua alat di atas adalah built-in di alat systemd-analysis yang datang secara default dengan systemd di archlinux setidaknya. Saya pikir ada beberapa proyek pihak ke-3 yang menghadapinya juga.

IBr
sumber
Terima kasih atas jawaban Anda, namun itu tidak menjawab pertanyaan dan hanya mengulangi bagian dari pertanyaan saya (saya sebutkan bahwa saya mengetahui cara bagaimana melakukannya dengan menganalisis data status systemd). Oleh karena itu pertanyaannya adalah bagaimana cara mendapatkan pstree-like tree dari urutan boot up setelah semua dependensi diselesaikan (mis. Post-boot). Rantai kritis hampir seperti itu (meskipun itu adalah pohon bottom-up) tetapi tidak mencantumkan semua unit awal. Apa yang ditanyakan dalam pertanyaan: pohon yang mencantumkan setiap unit tunggal yang dieksekusi hingga titik tertentu (misalnya, memukul multi-user.target).
galaksi
4
systemd-analyze plot > something.svgpenuh tiga eksekusi dengan target (ini adalah yang paling dekat yang Anda inginkan). systemd-analysis dot adalah grafik penuh dependensi (ini adalah representasi yang paling benar). Bukankah ini yang kamu inginkan? Dalam plot hanya menemukan target dan melihat apa yang perlu dijalankan. Dependensi yang sama persis dengan grafik terdaftar, jika terlalu banyak menjalankan beberapa toolkit analisis grafik dan pilih titik grafik yang ingin Anda lihat dependensinya (dot tool memiliki lebih banyak pengaturan). Lihat halaman manual: freedesktop.org/software/systemd/man/systemd-analyze.html --pesanan dan sejenisnya
IBr
1
Dari halaman manual: Ini memplot semua dependensi dari unit apa pun yang namanya dimulai dengan "avahi-daemon.": $ systemd-analyze dot 'avahi-daemon.*' | dot -Tsvg > avahi.svg $ eog avahi.svgIni memplot dependensi antara semua unit target yang diketahui:systemd-analyze dot --to-pattern='*.target' --from-pattern='*.target' | dot -Tsvg > targets.svg $ eog targets.svg
IBr
1
Sayang, tapi ini tidak bisa digunakan di konsol teks, sayangnya. Saya sangat menghargai waktu yang Anda habiskan untuk jawaban (dan itu benar jika Anda ingin mendapatkan beberapa data untuk dianalisis), tetapi itu tidak menjawab pertanyaan awal, jadi saya bisa menerimanya. Maaf.
galaksi
1
OK tidak masalah. Saya suka alat baris perintah sendiri :)
IBr
13

Mungkin masih belum sepenuhnya menjawab pertanyaan Anda tetapi coba dengan --fuzzopsi

systemd-analyze critical-chain --fuzz 1h

Catatan Anda juga dapat menentukan unit s untuk melihat rantai kritisnya , sehingga Anda tidak terbatas pada multi-user.target

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

Semoga ini membantu

Ludovic Ronsin
sumber
12

Tidak yakin saya memahami pertanyaan dengan benar, tetapi ada visualisasi pohon yang tersedia dengan perintah berikut:

sudo systemctl status

Dan juga :

sudo systemctl list-dependencies 

Semoga ini membantu :)

Juga, mungkin berguna untuk keperluan lain untuk membangun pohon folder symlinks systemctl:

tree /etc/systemd/system

Sebenarnya sangat berguna untuk mengetahui unit lama / kereta yang memperlambat startup sistem saya, untuk menonaktifkannya kemudian menggunakan systemctl disableperintah.

SUNTING

Yang mengatakan saya sangat setuju dengan OP bahwa fungsi dasar ini harus diberikan melalui alat baris perintah, dan bukan alat grafis ... Bagaimana jika Anda tidak dapat memulai X? Bagaimana Anda menangani file svg Anda?

Sebenarnya ada jalan. Jika Anda tidak dapat menggunakan scp(alat ssh) untuk mengambil file Anda di komputer lain, fbimungkin sebenarnya membantu Anda :)

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

Bekerja di TTY saya. Navigasi saja di dalam gambar dengan panah. Ada opsi pembesaran, untuk daftar lakukan fbi -h.

Sekali lagi saya berharap ini membantu. Ini tersedia di Archlinux dan repos Ubuntu.

EDIT 2:

fbitidak bekerja melebihi ssh. Anda dapat melakukan penerusan X seperti ini ssh -Y user@server, tetapi Anda memerlukan server X yang berjalan di server jarak jauh Anda.

Taruhan terbaik di sini adalah menggunakan sshfs. Ini berfungsi BESAR di userspace, misalnya dengan nautilus. Ada sedikit konfigurasi yang harus dilakukan, lihat:

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
Joel.O
sumber
Pertanyaannya adalah tentang pohon eksekusi untuk semua unit yang diaktifkan systemd melewati setelah resolusi ketergantungan. Jadi jawaban ini salah.
galaksi
Mungkin pertanyaan Anda cocok untuk permintaan fitur? Tentu itu akan membantu. Lagi pula, saya memposting jawaban ini setelah tersandung ke pertanyaan Anda karena itu entah bagaimana mirip dengan pertanyaan lain saya butuh info, dan saya merasa bahwa beberapa contoh dasar kurang (seperti hal-hal yang telah Anda coba dan tidak berfungsi - itu akan benar-benar membantu mengklarifikasi), terutama bagi orang - orang seperti saya berjuang setelah kehilangan System V init dan file rc.conf mereka yang praktis. Maaf jawaban saya tidak cocok. Tidak layak downvote.
Joel.O
Diedit dengan solusi untuk masalah Anda. Semoga ini bisa membantu lagi.
Joel.O
Saya tidak dapat menggunakan fbi di ssh di server saya. Tetapi sshfsbekerja lebih baik. Lihat EDIT 2.
Joel.O