GNU/Linux >> Linux の 問題 >  >> Linux

Systemdで注文サイクルをデバッグするための一般的な方法論?

私は次のスレッドとおそらくそれに対する答えを知っています。答えを除いて、一般的な意味での答えではありません。ある特定のケースで問題が何であったかを示しますが、一般的ではありません。

私の質問は、一般的なで注文サイクルをデバッグする方法はありますか? 仕方?例:サイクルと、あるユニットを別のユニットにリンクするものを説明するコマンドはありますか?

たとえば、journalctl -bには次のようなものがあります。 (日付は無視してください。私のシステムには時刻を同期するRTCがありません):

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

ここで、cvol.service(導入され、サイクルを壊すもの)は次のとおりです。

[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

journalctlによると、cvol.serviceはbasic.serviceを必要としていますが、少なくとも明らかにそうではありません。このリンクがどこから派生したかを示すコマンドはありますか?そして、一般的に、サイクルを見つけて、サイクル内の各リンクがどこから発生したかを示すコマンドはありますか?

承認された回答:

コマンドsystemd-analyze verifyを使用して、サイクルを視覚化できます。 、systemd-analyze dot およびGraphVizdot ツール:

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

次のように表示されます:

ここでサイクルを見ることができます:c.service->b.service->a.service->c.service

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

リンク:

  • systemd-analyze(1)
  • dot(1)
関連:Php:gc_collect_cycles —既存のガベージサイクルの収集を強制します
Linux
  1. cronjobsの代わりにsystemdタイマーを使用する

  2. Linuxでの起動時にsystemdを理解する

  3. 10の便利なsystemdコマンド:リファレンス

  1. LinuxでSystemdサービスを作成する方法

  2. Bashスクリプトをデバッグする方法は?

  3. Linux – LinuxでサスペンドからRAMへの問題をデバッグする方法は?

  1. Linux – SystemdのすべてのデーモンにデフォルトのCPUアフィニティを設定するにはどうすればよいですか?

  2. CentOS/RHEL 7 および 8 で systemd ブート プロセスをデバッグする方法

  3. Systemd postgresql 起動スクリプト