ファイルがなくなった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 ~ $
では、どうすればこれらを取り除くことができますか?
あなたがしているコマンドはsystemctl reset-failed
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:"
他のユニットがありますが、他のユニットは使用していません。
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.service
、example-bar.service
、example-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
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.