systemd
コマンド一覧
コマンド | 説明 |
---|---|
systemd-analyze plot | SVG 形式で起動時 unitの開始・終了を図にする |
systemd --test --system | unit や設定を読んで実行 job を計算する |
systemctl get-default | デフォルトターゲット確認 |
systemctl list-dependencies | 依存unit一覧を出力 |
systemctl daemon-reload | ユニットファイルリロード |
systemctl status [unit] | unitの状態確認 |
systemctl show [unit] | unitパラメータ確認 |
systemctl list-units | ユニット一覧 |
systemctl list-unit-files | ユニットファイル一覧 |
systemctl cat [unit] | ユニットファイルの内容出力 |
コマンド例
systemd-analyze plot
$ systemd-analyze plot > plot.html
prot.htmlをブラウザで開くと図が表示される
enable / disable
$ systemctl enable [service]
$ systemctl disable [service]
prot.htmlをブラウザで開くと図が表示される
systemctl list-dependencies
$ systemctl list-dependencies multi-user.target
$ systemctl list-dependencies multi-user.target -a
$ systemctl list-dependencies multi-user.target --after
$ systemctl list-dependencies multi-user.target --before
注意したいのはこのコマンドで表示されるツリーは「起動順序」は示していないこと。
必要とされるunitを示しているだけ。
-a サービスが依存しているユニットも表示
--after/--before 依存関係を表示
systemctl daemon-reload
systemdはunitファイルを読み込みメモリ上にunitを作成する
$ systemctl daemon-reload
unit file定義
service基本フロー
上から順に実行されていく。failの場合はExecStopPostが実行され終了する
ExecStartPre
ExecStart
ExecStartPost
ExecStop(正常終了の場合のみ)
ExecStopPost
ExecReload(リロード)
After Requires
After=はサービスの順序を設定し、Requires=は依存関係を示します。順序を指定しない場合、依存するサービスと同時に依存するサービスが開始されます。
Requiresは必要とするものを指定する。必要なので必ずアクティブになっている。Requiresを指定してAfterを指定していない場合は最終的にどちらも起動すればよいので、順序は補償されない。だから必ず指定すること。
Wantsはほしいものを指定する。(してほしい、されてほしい)なので必ずアクティブになっているとは限らない
RequiredBy
指定したサービスがアクティブになると自身もアクティブになる。
指定したサービスが失敗すると自身も停止する。
Type
simple: 実行されたプロセスが直接サービスを提供するタイプのプログラム。
forking: 実装プロセス側でdaemon 化する場合
oneshot: 初期化など1発実行する
既存ユニットのカスタマイズ方法
drop-inに書く
以下例:
unit:/lib/systemd/system/httpd.service
drop-in: /etc/systemd/system/httpd.service.d/xxx.conf
(拡張子は*.confにすること)
*.confに書いた設定が上書きされる
試してみる
RequiredBy / WantedByがうまくいかない
試してみると RequiredByを指定しているのになぜか依存先が失敗しているのに起動してしまう。
その理由は、RequiredBy / WantedByのシンボリックリンクの作成はsystemctl enableにしたときに作成されるから。
つまりRequiredBy / WantedByを書き換えると、disable enableが必要になる。(面倒くさい)
シンボリックリンクは例えば「/etc/systemd/system/test1.service.requires」ディレクトリに作成される。
以下マクロで行う
#!/bin/bash
sudo systemctl disable test1.service
sudo systemctl disable test2.service
sudo systemctl enable test1.service
sudo systemctl enable test2.service
sudo systemctl daemon-reload
sudo systemctl list-dependencies test1.service --after
After Beofreが逆?
test1.service
[Unit]
Description = test2
[Service]
Type = simple
[Install]
WantedBy = multi-user.target
test2.service
[Unit]
Description = test2
After = test1.service
[Service]
Type = simple
[Install]
WantedBy = multi-user.target
test2.serviceのAfter=test1.serviceなので
test1.service→test2.serviceだと思うのだが、なぜか逆の意味になってる。
sudo systemctl list-dependencies test1.service --after
test1.service
● tqsystem.slice
● tqsystemd-journald.socket
● tqbasic.target
● x tq-.mount
● x tqsystemd-ask-password-plymouth.path
sudo systemctl list-dependencies test2.service --after
test2.service
● tqsystem.slice
● tqsystemd-journald.socket
● tqtest1.service