我读到有两个单位文件文件夹(不在用户模式下)。
/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单元执行的脚本放在哪里?
放置系统单元文件的最佳位置: /etc/systemd/system
只需确保在[安装]部分下添加了一个目标,请阅读“如何知道?” 有关详细信息。UPDATE:/usr/local/lib/systemd/system
是另一个选项,请阅读“灰色区域”以获取详细信息。”
放置用户单元文件的最佳位置: /etc/systemd/user
或,$HOME/.config/systemd/user
但这取决于权限和情况。
事实是,系统化的单位(或如序言中所称的“单位配置”)可以在任何地方使用-只要您愿意进行手动符号链接并且您已经意识到了警告。systemctl daemon-reload
出于某些良好的原因,使将设备放置在可以找到它的地方变得更容易:
systemctl enable
。这是因为您的单元将自动添加到单元相关性树(单元缓存)中。以及如何确切systemctl enable
知道在哪里创建符号链接?您可以在该[install]
部分下的单元本身中对其进行硬编码。通常有一条线像
[Install]
WantedBy = multi-user.target
对应于文件系统上的预定义位置。这样,就systemctl
知道该单元依赖于一组称为的单元文件multi-user.target
(“ target”是用于指定单元依赖项组的术语。您可以使用列出所有组systemctl list-units --type target
)。要与目标一起加载的单元文件组放在targetname.target.wants
目录中。这只是一个充满符号链接(或真实内容)的目录。如果你的[Install]
部分说,这是WantedBy
对multi-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] 删除。
我来说两句