![Ubuntu 中的 systemd 单元/服务位于哪里?](https://linux22.com/image/890486/Ubuntu%20%E4%B8%AD%E7%9A%84%20systemd%20%E5%8D%95%E5%85%83%2F%E6%9C%8D%E5%8A%A1%E4%BD%8D%E4%BA%8E%E5%93%AA%E9%87%8C%EF%BC%9F.png)
我在谷歌上搜索时发现它们位于 /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
在包索引中搜索。
/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>
产生更多低级程序可读的输出