GNU/Linux >> Belajar Linux >  >> Linux

Metodologi Generik Untuk Men-debug Siklus Pemesanan Di Systemd?

Saya mengetahui utas berikut dan seharusnya menjawabnya. Kecuali jawaban bukanlah jawaban dalam arti umum. Ini memberi tahu apa masalahnya dalam satu kasus tertentu, tetapi tidak secara umum.

Pertanyaan saya adalah:apakah ada cara untuk men-debug siklus pemesanan dalam generik jalan? Misalnya:apakah ada perintah yang akan menjelaskan siklus dan apa yang menghubungkan satu unit ke unit lain?

Sebagai contoh, saya telah mengikuti di journalctl -b (harap abaikan tanggal, sistem saya tidak memiliki RTC untuk menyinkronkan waktu):

Jan 01 00:00:07 host0 systemd[1]: Found ordering cycle on sysinit.target/start
Jan 01 00:00:07 host0 systemd[1]: Found dependency on local-fs.target/start
Jan 01 00:00:07 host0 systemd[1]: Found dependency on cvol.service/start
Jan 01 00:00:07 host0 systemd[1]: Found dependency on basic.target/start
Jan 01 00:00:07 host0 systemd[1]: Found dependency on sockets.target/start
Jan 01 00:00:07 host0 systemd[1]: Found dependency on dbus.socket/start
Jan 01 00:00:07 host0 systemd[1]: Found dependency on sysinit.target/start
Jan 01 00:00:07 host0 systemd[1]: Breaking ordering cycle by deleting job local-fs.target/start
Jan 01 00:00:07 host0 systemd[1]: Job local-fs.target/start deleted to break ordering cycle starting with sysinit.target/start

di mana cvol.service (yang diperkenalkan, dan yang memutus siklus) adalah:

[Unit]
Description=Mount Crypto Volume
After=boot.mount
Before=local-fs.target

[Service]
Type=oneshot
RemainAfterExit=no
ExecStart=/usr/bin/cryptsetup open /dev/*** cvol --key-file /boot/***

[Install]
WantedBy=home.mount
WantedBy=root.mount
WantedBy=usr-local.mount

Menurut journalctl, cvol.service menginginkan basic.service, kecuali bahwa tidak, setidaknya tidak jelas. Apakah ada perintah yang akan menunjukkan dari mana tautan ini berasal? Dan secara umum, apakah ada perintah, yang akan menemukan siklus dan menunjukkan dari mana setiap tautan dalam siklus berasal?

Jawaban yang Diterima:

Anda dapat memvisualisasikan siklus dengan perintah systemd-analyze verify , systemd-analyze dot dan GraphViz dot alat:

systemd-analyze verify default.target |&
perl -lne 'print $1 if m{Found.*?ons+([^/]+)}' |
xargs --no-run-if-empty systemd-analyze dot |
dot -Tsvg >cycle.svg

Anda akan melihat sesuatu seperti ini:

Di sini Anda dapat melihat siklusnya:c.service->b.service->a.service->c.service

Color legend: 
    black     = Requires
    dark blue = Requisite
    dark grey = Wants
    red       = Conflicts
    green     = After

Tautan:

  • systemd-analyze(1)
  • titik(1)
Terkait:Php:gc_collect_cycles — Memaksa pengumpulan semua siklus sampah yang ada
Linux
  1. Cara Debug proses boot systemd di CentOS/RHEL 7 dan 8

  2. Bagaimana menghentikan layanan systemd

  3. Skrip mulai systemd postgresql

  1. Debug Linux menggunakan ProcDump

  2. Gunakan pengatur waktu systemd alih-alih cronjobs

  3. menggunakan pengatur waktu systemd, bukan cron

  1. Cara membuat layanan Systemd di Linux

  2. Menambahkan layanan baru ke sistem Linuxd

  3. Bagaimana Cara Men-debug Skrip Bash?