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

Gue*_*OCs 57 boot 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
Run Code Online (Sandbox Code Playgroud)

其他人在哪里?

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

mur*_*uru 84

包提供的服务文件通常都位于/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/*
Run Code Online (Sandbox Code Playgroud)

后者用于用户会话。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
Run Code Online (Sandbox Code Playgroud)


Mar*_*erg 16

每当您需要定位某些东西时,都有一些很好的工具可供了解。

第一个是locate,用于按名称定位文件。它使用预先构建的索引,因此速度非常快。但是,它有时会遗漏尚未编入索引的新文件,或者也可能会遗漏具有限制性权限的文件。在这种情况下,一个快速locate命令会找到 Ubuntu 上的所有 systemd 文件:

locate systemd
Run Code Online (Sandbox Code Playgroud)

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

locate systemd | grep plex
Run Code Online (Sandbox Code Playgroud)

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

find / -name plexmediaserver.service
Run Code Online (Sandbox Code Playgroud)

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

dpkg -l '*plex*'
Run Code Online (Sandbox Code Playgroud)

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

dpkg -L plexmediaserver
Run Code Online (Sandbox Code Playgroud)

同样,您可以使用管道将结果过滤为您正在查找的服务文件:

dpkg -L plexmediaserver | grep plexmediaserver.service
Run Code Online (Sandbox Code Playgroud)

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


sma*_*c89 10

使用systemd-analyze命令:

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

systemd-analyze --user unit-paths
Run Code Online (Sandbox Code Playgroud)

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

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

systemd-analyze --system unit-paths
Run Code Online (Sandbox Code Playgroud)

请参阅:联机帮助页