Bagaimana cara menghapus unit systemd yang hilang?

40

Saya mengalami kesulitan mencari tahu cara menghapus unit systemd yang tidak lagi memiliki file. Mereka tampaknya masih tertinggal dalam sistem entah bagaimana.

Unit rusak lama yang saya coba hapus:

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'.

File tidak ada, namun reload masih memiliki unit-unit ini melekat:

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'.

Tidak ada file yang terkait dengan mereka yang dapat saya temukan:

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 ~ $

Jadi, bagaimana saya menyingkirkan ini?

Andy Shinn
sumber
Anda tidak menyebutkannya, tapi saya kira itu gagal jika Anda mencobanya systemctl disable, kan?
dawud
2
Itu hanya ada dengan 0. Tidak ada yang dinonaktifkan (sudah hilang / dinonaktifkan).
Andy Shinn
Saya mencoba semua solusi yang disarankan di sini (dan di bawah sejauh ini) dan reboot dan tidak ada yang berhasil. Unit yang saya coba hapus pernah dipasang atau mencoba untuk menginstal, dan kemudian apt dibersihkan. Jadi sepertinya apt purge tidak menghapus konfigurasi yang diberikan ke systemd. Masih belum jelas bagi saya jika unit "tidak ditemukan" ini menimbulkan masalah.
Tampilan elips
Saya kira saya mungkin bisa menghapus file di / var / lib / systemd / deb-systemd-helper-enabled / tetapi saya tidak yakin apakah saya ingin mengacaukannya. Saya tampaknya memiliki dua jalan buntu yang dikenal di sana: mariadb.service.dsh-juga dan mysql.service.dsh-juga
Tampilan elips
@ Elipticalview Buat cadangan file-file ini, untuk berjaga-jaga, dan kemudian hapus ini?
gf_

Jawaban:

76

Perintah yang Anda cari adalah systemctl reset-failed

pengguna227117
sumber
3
Terima kasih! Saya tidak tahu mengapa itu tidak lebih jelas bagi saya ...
Andy Shinn
6
Ini bekerja untuk akhirnya membersihkan layanan "nyata", tetapi saya memiliki layanan alias yang menolak untuk pergi. Saya mencoba disable, daemon-reloaddan reset-failedtetapi layanan alias muncul seperti not-found inactive deadbiasa. Saya juga mencari disk apa pun yang cocok dengan nama layanan tanpa hasil.
Mark Lakata
3
Saya hanya mengalami ini dan systemctl stop <service>bekerja untuk saya.
mpontillo
Hal yang sama berlaku untuk timer - mereka harus dihentikan terlebih dahulu sebelum reset-faileddapat membersihkannya.
rustyx
Agak bekerja untuk saya, tetapi saya harus topeng kemudian membuka kedok pertama untuk salah satu dari mereka. Juga, harus berhenti satu lalu tutup dan buka topeng setelah reset-gagal akhirnya menyingkirkan semua.
tgunr
2

Ketika systemd menganalisis file definisi unit, perlu dicatat setiap unit terkait lainnya yang dipanggil dalam file - apakah unit lain itu ada atau tidak.

$ 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> )

Ketika sebuah unit muncul sebagai "tidak ditemukan", itu tidak selalu merupakan kesalahan - yang kita tahu adalah, definisi unit lokal mengklaim memiliki beberapa hubungan dengannya. Hubungan ini mungkin bukan yang kita pedulikan. Misalnya, itu bisa berupa "Before:"unit lain, tetapi kami tidak menggunakan unit lain itu.

AaronDanielson
sumber
0

Tampaknya systemd memelihara tautan tetapi tidak tahu apa yang harus dilakukan dengan mereka ketika Anda menghapus file unit.

Anda dapat mencoba untuk menghapusnya secara manual /etc/systemd/system/suspend.target.wants/dan semacamnya tetapi tentu saja systemctl reset-faileddari jawaban sebelumnya sepertinya pilihan yang lebih baik.

$ 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.
Rolf
sumber