Ubuntu 中的 systemd 单元/服务位于哪里?

Ubuntu 中的 systemd 单元/服务位于哪里?

我在谷歌上搜索时发现它们位于 /usr/lib/systemd/system/ 和 /etc/systemd/system/。然而,在我的 ubuntu 中,第一个根本不存在,而另一个只有几个服务

bluetooth.target.wants                      default.target.wants           hybrid-sleep.target.wants    shutdown.target.wants
dbus-org.bluez.service                      display-manager.service        multi-user.target.wants      sockets.target.wants
dbus-org.freedesktop.Avahi.service          display-manager.service.wants  network-online.target.wants  suspend.target.wants
dbus-org.freedesktop.ModemManager1.service  getty.target.wants             paths.target.wants           sysinit.target.wants
dbus-org.freedesktop.nm-dispatcher.service  graphical.target.wants         plexmediaserver.service      syslog.service
dbus-org.freedesktop.thermald.service       hibernate.target.wants         printer.target.wants         timers.target.wants

其他人在哪儿?

当我运行 systemctl list-units 时,我看到很多服务,但我不知道在哪里找到它们。例如,我的 plexmediaserver.service 在哪里?我需要知道,因为我想把其他单元放在那里。

答案1

软件包提供的服务文件通常都位于 中/lib/systemd/system。例如,.service在包索引中搜索

man systemd.unit

/etc/systemd/system/*
/run/systemd/system/*
/lib/systemd/system/*
...

$XDG_CONFIG_HOME/systemd/user/*
$HOME/.config/systemd/user/*
/etc/systemd/user/*
$XDG_RUNTIME_DIR/systemd/user/*
/run/systemd/user/*
$XDG_DATA_HOME/systemd/user/*
$HOME/.local/share/systemd/user/*
/usr/lib/systemd/user/*

后者用于用户会话。IIRC Ubuntu 16.04 仍然使用 upstart 进行用户会话,因此这些文件仅适用于 16.04 之后的版本。

对于特定服务,要查看 systemd 正在读取的内容,请运行systemctl status <service>systemctl show <service>

$ systemctl show ssh.service | grep Path
FragmentPath=/lib/systemd/system/ssh.service
DropInPaths=/etc/systemd/system/ssh.service.d/override.conf
$ systemctl status ssh.service
● ssh.service - OpenBSD Secure Shell server
   Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
  Drop-In: /etc/systemd/system/ssh.service.d
           └─override.conf
   Active: active (running) since Thu 2017-01-26 16:06:53 JST; 21h ago
 Main PID: 948 (sshd)
   CGroup: /system.slice/ssh.service
           └─948 /usr/sbin/sshd -D

答案2

当您需要定位某个东西时,可以使用一些很好的工具。

第一个是locate,用于按名称查找文件。它使用预建索引,因此速度极快。但是,它有时会错过尚未编入索引的新文件,也可能错过具有限制权限的文件。在这种情况下,快速命令locate将找到 Ubuntu 上的所有 systemd 文件:

locate systemd

如果您想关注该 Plex 文件,则可以使用管道来过滤结果:

locate systemd | grep plex

另一个需要了解的工具是find,它可以实时搜索特定目录以查找文件。它有一个很多选项。查看man find详细信息。要查找plexmediaserver.service系统上的任何位置,您可以使用:

find / -name plexmediaserver.service

最后,在这种情况下,你可能知道哪个包裹您要查找的文件所属的包。如果您不确定确切的包名称,可以使用此语法查找名称中包含“plex”的所有包:

dpkg -l '*plex*'

如果您发现您感兴趣的包名为“plexmediaserver”,那么您可以使用此语法列出该包中的所有文件:

dpkg -L plexmediaserver

再次,您可以使用管道将结果过滤为仅显示您正在寻找的服务文件:

dpkg -L plexmediaserver | grep plexmediaserver.service

现在您将能够找到许多常见情况的文件。

答案3

使用systemd-analyze命令:

所有文件夹可能包含用户服务:

systemd-analyze --user unit-paths

我更喜欢systemd-analyze --global unit-paths

所有文件夹可能包含系统服务:

systemd-analyze --system unit-paths

看:手册页

答案4

在以下位置找到三个目录的三个命令man systemd

$ pkg-config systemd --variable=systemdsystemunitdir
/lib/systemd/system

$ pkg-config systemd --variable=systemdsystemconfdir
/etc/systemd/system

$ pkg-config systemd --variable=systemduserconfdir
/etc/systemd/user

我正在运行 Ubuntu 20.04

附加说明:systemctl status <service>产生更多人类可读的输出,同时systemctl show <service>产生更多低级程序可读的输出

相关内容