web-dev-qa-db-ja.com

不足しているsystemdユニットを削除する方法は?

ファイルがなくなったsystemdユニットを削除する方法を理解できません。彼らはまだ何らかの形でシステムに残っているようです。

私が削除しようとしている古い壊れたユニット:

core@ip-172-16-32-83 ~ $ systemctl list-units --all firehose-router*
  UNIT                       LOAD      ACTIVE SUB    DESCRIPTION
<E2><97><8F> [email protected] not-found failed failed [email protected]
<E2><97><8F> [email protected] not-found failed failed [email protected]

LOAD   = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB    = The low-level unit activation state, values depend on unit type.

2 loaded units listed.
To show all installed unit files use 'systemctl list-unit-files'.

ファイルは存在しませんが、リロードにはこれらのユニットが残っています。

core@ip-172-16-32-83 ~ $ systemctl list-unit-files [email protected]
core@ip-172-16-32-83 ~ $ Sudo systemctl daemon-reload
core@ip-172-16-32-83 ~ $ systemctl list-units --all firehose-router*
  UNIT                       LOAD      ACTIVE SUB    DESCRIPTION
<E2><97><8F> [email protected] not-found failed failed [email protected]
<E2><97><8F> [email protected] not-found failed failed [email protected]

LOAD   = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB    = The low-level unit activation state, values depend on unit type.

2 loaded units listed.
To show all installed unit files use 'systemctl list-unit-files'.

私が見つけることができるそれらに関連するファイルはありません:

core@ip-172-16-32-83 ~ $ Sudo find /var/run/systemd -name "*firehose-router*"
core@ip-172-16-32-83 ~ $ find /etc/systemd/ -name "*firehose-router*"
core@ip-172-16-32-83 ~ $ find /usr/lib/systemd/ -name "*firehose-router*"
core@ip-172-16-32-83 ~ $

では、どうすればこれらを取り除くことができますか?

45
Andy Shinn

あなたがしているコマンドはsystemctl reset-failed

80
user227117

Systemdがユニット定義ファイルを分析するとき、他のユニットが存在するかどうかに関係なく、ファイル内で呼び出されている他の関連ユニットをすべて記録します。

$ systemctl --state=not-found --all
> ( ...prints list of 'not-found' units )

$ grep -r "<missing-unit>" /usr/lib/systemd/system
> ( returns files with references to <missing-unit> )

ユニットが「見つかりません」と表示された場合、それは必ずしもエラーではありません。ローカルユニットの定義はそれと何らかの関係があると主張しています。この関係は私たちが気にするものではないかもしれません。たとえば、"Before:"他のユニットがありますが、他のユニットは使用していません。

2
AaronDanielson
  • failed-ユニットが障害状態に入り、systemctl reset-failedコマンドでリセットできる場合に発生します
  • not-found-ユニットを削除したが、systemdがまだそれへの参照を持っている場合に発生します。たとえば、ユニットが有効になり、シンボリックリンクが/etc/systemd/systemに配置された場合などは、これへの参照を削除することで修正できますユニットを/etc/system/systemd/*.wants/に入れ、次にsystemctl daemon-reloadを実行します

たとえば、次のbashスクリプトを想定します。

#!/bin/bash
# script.sh
while true
do
    sleep 1
done

3つのsystemdユニット:example-foo.serviceexample-bar.serviceexample-baz.service

$ Sudo systemctl cat example-{foo,bar,baz}.service
# /etc/systemd/system/example-foo.service
[Service]
ExecStart=/home/vagrant/script.sh
[Install]
WantedBy=multi-user.target

# /etc/systemd/system/example-bar.service
[Service]
ExecStart=/home/vagrant/script.sh
[Install]
WantedBy=multi-user.target

# /etc/systemd/system/example-baz.service
[Service]
ExecStart=/home/vagrant/script.sh
[Install]
WantedBy=multi-user.target

次に、ユニットを起動して有効にします。シンボリックリンクが作成される方法を確認します。

$ Sudo systemctl start example-{foo,bar,baz}.service
$ Sudo systemctl enable example-{foo,bar,baz}.service
Created symlink from /etc/systemd/system/multi-user.target.wants/example-foo.service to /etc/systemd/system/example-foo.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/example-bar.service to /etc/systemd/system/example-bar.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/example-baz.service to /etc/systemd/system/example-baz.service.

3つのユニットに実際に6つのファイルがあることを確認します。

$ find /etc/systemd/system -name 'example*.service'
/etc/systemd/system/multi-user.target.wants/example-bar.service
/etc/systemd/system/multi-user.target.wants/example-foo.service
/etc/systemd/system/multi-user.target.wants/example-baz.service
/etc/systemd/system/example-bar.service
/etc/systemd/system/example-foo.service
/etc/systemd/system/example-baz.service

ここで、3つのユニットすべての状態を確認します。これらは実行されています。

$ systemctl list-units example*
UNIT                LOAD   ACTIVE SUB     DESCRIPTION
example-bar.service loaded active running example-bar.service
example-baz.service loaded active running example-baz.service
example-foo.service loaded active running example-foo.service

次に、SIGKILLをexample-foo.serviceに送信して、障害をシミュレートします。ユニットの障害状態を観察します。

$ Sudo systemctl kill -s KILL example-foo.service
$ systemctl list-units example*
  UNIT                LOAD   ACTIVE SUB     DESCRIPTION
  example-bar.service loaded active running example-bar.service
  example-baz.service loaded active running example-baz.service
● example-foo.service loaded failed failed  example-foo.service

ユニットを障害状態にリセットするには、systemctl rese-failedコマンドを使用します。ユニットがどのように非アクティブな状態になっているのかを観察します。

$ Sudo systemctl reset-failed
$ systemctl list-units example*
UNIT                LOAD   ACTIVE SUB     DESCRIPTION
example-bar.service loaded active running example-bar.service
example-baz.service loaded active running example-baz.service

...
$ systemctl list-units --all example*
UNIT                LOAD   ACTIVE   SUB     DESCRIPTION
example-bar.service loaded active   running example-bar.service
example-baz.service loaded active   running example-baz.service
example-foo.service loaded inactive dead    example-foo.service

では、example-bar.serviceユニットを削除しましょう。ユニットが見つからない状態であることを確認します。ただし、example-bar.serviceの壊れたシンボリックリンクはまだ/etc/system/system/multi-user.target.wantsにあります

$ Sudo rm /etc/systemd/system/example-bar.service
$ Sudo systemctl daemon-reload
$ Sudo systemctl stop example-bar.service
Failed to stop example-bar.service: Unit example-bar.service not loaded.
$ systemctl list-units --all example*
  UNIT                LOAD      ACTIVE   SUB     DESCRIPTION
● example-bar.service not-found inactive dead    example-bar.service
  example-baz.service loaded    active   running example-baz.service
  example-foo.service loaded    inactive dead    example-foo.service
$ find /etc/systemd/system -name 'example*.service'
/etc/systemd/system/multi-user.target.wants/example-bar.service
/etc/systemd/system/multi-user.target.wants/example-foo.service
/etc/systemd/system/multi-user.target.wants/example-baz.service
/etc/systemd/system/example-foo.service
/etc/systemd/system/example-baz.service

壊れたシンボリックリンクを削除し、example-bar.serviceユニットがなくなっていることを確認します。

$ Sudo rm /etc/systemd/system/multi-user.target.wants/example-bar.service
$ Sudo systemctl daemon-reload
$ systemctl list-units --all example*
UNIT                LOAD   ACTIVE   SUB     DESCRIPTION
example-baz.service loaded active   running example-baz.service
example-foo.service loaded inactive dead    example-foo.service
0
mbigras

Systemdはリンクを保持しているようですが、ユニットファイルを削除したときにリンクをどうするかわかりません。

/etc/systemd/system/suspend.target.wants/などで手動で削除することもできますが、もちろん以前の回答からsystemctl reset-failedを選択するほうがよいオプションのようです。

$ cd /etc/systemd/system
$ Sudo mv lock.service /tmp 
$ Sudo systemctl disable lock.service
Failed to disable unit: No such file or directory
$ Sudo mv /tmp/lock.service .
$ Sudo systemctl disable lock.service
Removed /etc/systemd/system/suspend.target.wants/lock.service.
0
Rolf