我的systemd单位文件放在哪里?

乔纳森·科玛(Jonathan Komar)

读到有两个单位文件文件夹(不在用户模式下)。

/usr/lib/systemd/system/: units provided by installed packages
/etc/systemd/system/: units installed by the system administrator

与这种理解相矛盾的是这个问题的答案:如何为Systemd编写启动脚本有人可以填写缺少的信息,以便我了解发生了什么吗?更新:答案已更新,我的理解不再与之冲突。

另外,脚本似乎组织在该/etc/systemd/system/文件夹中的子文件夹中:

getty.target.wants
multi-user.target.wants

在另一个位置,我读到还有其他位置。看来这些是针对特定于用户的服务的。

/usr/lib/systemd/user/ where services provided by installed packages go.
/etc/systemd/user/ where system-wide user services are placed by the system administrator.
~/.config/systemd/user/ where the user puts its own services.

更新2015-08-31:

为了其他人,这是我最近问过的一个相关问题的链接:我该把由systemd单元执行的脚本放在哪里?

乔纳森·科玛(Jonathan Komar)

放置系统单元文件的最佳位置 /etc/systemd/system只需确保在[安装]部分下添加了一个目标,请阅读“如何知道?” 有关详细信息。UPDATE/usr/local/lib/systemd/system是另一个选项,请阅读“灰色区域”以获取详细信息。”

放置用户单元文件的最佳位置 /etc/systemd/user或,$HOME/.config/systemd/user但这取决于权限和情况。

事实是,系统化的单位(或如序言中所称的“单位配置”)可以在任何地方使用-只要您愿意进行手动符号链接并且您已经意识到了警告。systemctl daemon-reload出于某些良好的原因,使将设备放置在可以找到它的地方变得更容易

  • 使用标准位置意味着systemd生成器将找到它们并使它们易于在启动时启用systemctl enable这是因为您的单元将自动添加到单元相关性树(单元缓存)中。
  • 您无需考虑权限,因为只有正确的特权用户才可以写入指定的区域。

怎么知道

以及如何确切systemctl enable知道在哪里创建符号链接?您可以在该[install]部分下的单元本身中对其进行硬编码通常有一条线像

[Install]
WantedBy = multi-user.target

对应于文件系统上的预定义位置。这样,就systemctl知道该单元依赖于一组称为的单元文件multi-user.target(“ target”是用于指定单元依赖项组的术语。您可以使用列出所有组systemctl list-units --type target)。要与目标一起加载的单元文件组放在targetname.target.wants目录中。这只是一个充满符号链接(或真实内容)的目录。如果你的[Install]部分说,这是WantedBymulti-user.target的,但如果一个符号链接它不存在的multi-user.target.wants目录,那么它不会加载。当systemd单元生成器在引导时将单元文件添加到依赖关系树缓存中时(您可以使用手动触发生成器systemctl daemon-reload),它会自动知道将符号链接放置在哪里(在这种情况下位于目录中)/etc/systemd/system/multi-user.target.wants/ 你应该启用它。

手册中的重点:

可能会将其他单元从不在单元加载路径上的目录加载到systemd(“链接”)中。有关systemctl(1)的信息,请参见link命令。

在systemctl下,查找单位文件命令

单位文件加载路径

请阅读并理解以下引号中的第一句话man systemd.unit(因为这意味着如果您的systemd是用不同的路径编译的,那么我在这里提到的所有路径可能不适用于您):

单位文件是从编译期间确定的一组路径中加载的,如下两张表所述。在较早列出的目录中找到的单位文件会覆盖列表下面较低目录中具有相同名称的文件。

当变量$SYSTEMD_UNIT_PATH被设置,此变量的内容覆盖单元负载路径。如果$SYSTEMD_UNIT_PATH以空的组件(“:”)结尾,则通常的单位加载路径将附加到变量的内容中。

表1和表2man systemd.unit都不错。

在系统模式(--system)中运行时加载路径

  • /etc/systemd/system 本地配置
  • /run/systemd/system 运行时间单位
  • /usr/lib/systemd/system已安装软件包的单位(或/lib/systemd/system在某些情况下,请阅读man systemd.unit

在用户模式(--user下运行时的加载路径

每个用户单位与所有/全局用户单位之间存在差异

取决于用户

  • $XDG_CONFIG_HOME/systemd/user用户配置(仅在$XDG_CONFIG_HOME设置时使用

  • $HOME/.config/systemd/user用户配置(仅在$XDG_CONFIG_HOME未设置时使用)

  • $XDG_RUNTIME_DIR/systemd/user运行时间单位(仅在$XDG_RUNTIME_DIR设置时使用

  • $XDG_DATA_HOME/systemd/user主目录中已安装的软件包的单位(仅在$XDG_DATA_HOME设置时使用

  • $HOME/.local/share/systemd/user主目录中已安装的软件包的单位(仅在$XDG_DATA_HOME未设置时使用)

--global (全部用户)

适用于所有用户的单位-也意味着每个用户拥有的单位。因此,即使管理员在启动时启用了这些服务,每个用户也可以停止这些服务。

  • /etc/systemd/user所有用户的本地配置(systemctl --global enable userunit.service
  • /usr/lib/systemd/user已为所有用户/lib/systemd/system系统范围内安装的软件包的单位(或在某些情况下,请阅读man systemd.unit)
  • /run/systemd/user 运行时间单位

灰色地带

一方面,文件层次结构标准指定/etc用于不执行二进制文件的本地配置。另一方面,它指定/usr/local/“供本地安装软件时的系统管理员使用”。您还可以争辩说(如果不仅仅是为了组织目的)所有系统单元文件都应该存在于之下/usr/local/lib/systemd/system,但这是针对属于“软件”而不是来自程序包管理器的单元文件的。全系统范围内的相应systemd用户单元可能位于下方/usr/local/lib/systemd/user

暂态单元

另一个被遗忘的地方根本就不存在!也许鲜为人知的程序是systemd-run您可以使用它来快速运行瞬态单元。man systemd-run

例如,要安排明天早上4点重新启动(您可能需要--force确保重新启动发生):

systemd-run -u restart --description="Restarts machine" --on-calendar="2020-12-18 00:04:00" systemctl --force reboot

这将产生一个暂态单位文件restart.service和一个相应的计时器(因为,由--on-calendar表示transient=yes

/run/systemd/transient/restart.service

# This is a transient unit file, created programmatically via the systemd API. Do not edit.
[Unit]
Description=Restarts machine

[Service]
ExecStart=
ExecStart="/usr/bin/systemctl" "--force" "reboot"

请注意,还有一个更危险的“双力”选项--force --force,该选项告诉内核立即停止(并且,如果您不知道自己在做什么,则不安全,因为这几乎等同于切断电源)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

我的PHP文件放在哪里

来自分类Dev

我应该把 .Appimages 文件放在哪里?

来自分类Dev

我应该把由systemd单元执行的脚本放在哪里?

来自分类Dev

我应该把由systemd单元执行的脚本放在哪里?

来自分类Dev

systemd实际在哪里搜索单位?

来自分类Dev

我的Hello world PHP文件放在哪里?

来自分类Dev

我将生成的Javdoc html文件放在哪里?

来自分类Dev

我的base.html文件放在哪里?

来自分类Dev

带路径的mv ..:我的文件存放在哪里?

来自分类Dev

我应该把 Apache 头文件放在哪里?

来自分类Dev

Travis CI 把我的源文件放在哪里?

来自分类Dev

我应该把扩展文件夹放在哪里

来自分类Dev

我会把文件搜索放在哪里

来自分类Dev

mv把文件放在哪里?

来自分类Dev

我应该把NSNotification的removeObserver放在哪里

来自分类Dev

我将PDO放在哪里?

来自分类Dev

我将存根放在哪里?

来自分类Dev

闭环-我应该放在哪里?

来自分类Dev

我在函数中将$(this)放在哪里?

来自分类Dev

.tolowerCase()我应该放在哪里?

来自分类Dev

我的辅助函数放在哪里?

来自分类Dev

我将图像资源放在哪里?

来自分类Dev

eunit的测试文件放在哪里?

来自分类Dev

“ make install”将文件放在哪里?

来自分类Dev

.deb文件在安装后会放在哪里?

来自分类Dev

gdb将日志文件放在哪里?

来自分类Dev

守护程序文件放在哪里?

来自分类Dev

插件的接口文件放在哪里?

来自分类Dev

前端javascript文件放在哪里?