我找不到执行某些操作的正确方法当地的systemd 上的脚本(或非常本地的命令),我已经知道我不能为此类脚本创建服务(在 systemd 中的一个单元中)(或者我必须?)....
我发现的解决方法是创建 rc.local 并赋予其执行权限。
printf '#!/bin/bash \n\nexit 0' >/etc/rc.local
chmod +x /etc/rc.local
例如,如果我得到一个由您配置了简单 rc.local 的旧服务器,我就会知道您做了什么,以及在发行版上升级或安装新内容会有多大伤害,因为 rc.local 受到外部尊重包,但另一方面,如果我安装一个服务器并创建一个或两个或三个 systemd 单元(甚至 sysvinit 服务),只是为了完成一项简单的任务,这有时会让你的生活变得更加困难,而且比我的单元还要困难得多名称有一天可能会与发行版开发创建的新服务的名称发生冲突,并且可能在升级时安装,从而给我的脚本带来麻烦!
我懂了另一个问题询问rc.local 在哪里答案是创建它并授予执行权限,我认为我的问题确实是不是A复制,因为我不想知道它在哪里 - 相信我,我只是想接受这是已弃用但是我找不到做这种事情的正确方法,我真的应该为这样的简单事情创建一个单位吗?
答案1
rc-local.service
正如其他地方所指出的,在 下使用它会变得相当不干净systemd
。
- 理论上,您的发行版可能不会启用它。 (我认为这并不常见,例如因为禁用相同的构建选项也会删除很多人使用的
poweroff
/命令)。reboot
- 语义并不完全清楚。 Systemd 定义了
rc-local.service
一种方式,但 Debian 提供了一个可以更改至少一项重要设置的嵌入式文件。
rc-local.service
经常可以很好地工作。如果您担心上述问题,您只需制作自己的副本即可!这就是魔法:
# /etc/systemd/system/my-startup.service
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/local/libexec/my-startup-script
[Install]
WantedBy=multi-user.target
我认为您不需要了解每一个细节[*],但这里您需要了解两件事。
您需要使用 来启用此功能
systemctl enable my-startup.service
。如果您的脚本依赖于任何其他服务(包括 )
network-online.target
,则必须声明它。例如,添加一个[Unit]
部分,其中包含行Wants=network-online.target
和After=network-online.target
。您无需担心对“早期启动”服务的依赖性 - 特别是之前已经订购的服务
basic.target
。此类服务my-startup.service
将在之后自动排序basic.target
,除非它们已设置DefaultDependencies=no
。如果您不确定您的依赖项之一是否是“早期启动”服务,一种方法是
basic.target
通过运行 来列出之前订购的服务systemctl list-dependencies --after basic.target
。 (注意是--after
,不是--before
)。
我认为有一些考虑因素也适用于 pre-systemd rc.local
:
- 您需要确保您的命令不会与试图控制同一事物的另一个程序发生冲突。
- 最好不要从
rc.local
.
[*] 我使用Type=oneshot
+是RemainAfterExit=yes
因为它对于大多数一次性脚本更有意义。它正式表明您将运行一系列命令,my-startup
一旦完成,这些命令将显示为“活动”,并且您不会启动守护程序。
答案2
把...忘了吧rc.local
。
作为我说的是CentOS 7和关于 Debian 8和关于Ubuntu 15:
您使用的是 systemd+Linux 操作系统。 /etc/rc.local
是 systemd 中的双重向后兼容机制,因为它是一个向后兼容机制,而该机制本身就是 van Smoorenburg System 5rc
克隆中的兼容机制。
使用/etc/rc.local
可能会出现严重错误。人们对 systemd 的运行rc.local
方式、引导程序中的相同位置与他们习惯的运行方式不同这一事实感到惊讶。 (或者错误地期望:事实上,它并没有运行最后的正如 OpenBSD 手册仍然指出的那样。)其他人感到惊讶的是,他们在期待旧的做事方式时所建立的东西,rc.local
然后被新udev
规则、NetworkManager systemd-logind
、、、systemd-resolved
或各种“套件”。
如“https://unix.stackexchange.com/questions/389289/”所示,一些操作系统已经提供了 systemd没有向后兼容功能比如systemd-rc-local-generator
发电机。 同时 Debian 仍然保留向后兼容功能,Arch Linux 构建 systemd 时关闭它们。所以在 Arch 和它所期望的操作系统上/etc/rc.local
被完全忽视。
把...忘了吧rc.local
。这不是要走的路。您有一个 systemd+Linux 操作系统。因此,创建一个适当的 systemd 服务单元,并且不要从两个级别的向后兼容性之外的点开始。 (在 Ubuntu 和 Fedora 上,它是三多次删除后,随后出现的 van Smoorenburg System 5rc
克隆版rc.local
已被本身两次十多年前,首先被新贵取代,然后被 systemd 取代。)
这甚至不是 systemd 特有的新想法。在 van Smoorenburgrc
和 Upstart 系统上,要做的事情是制作适当的 van Smoorenburgrc
脚本或 Upstart 作业文件,而不是使用rc.local
.甚至 FreeBSD 的手册也指出,如今人们创建了一个合适的 Mewburnrc
脚本,而不是使用/etc/rc.local
. Mewburnrc
由 NetBSD 1.5 于 2000 年引入。
/etc/rc.local
可以追溯到第七版 Unix 及之前的版本。它被 AT&T Unix System 3 取代/etc/inittab
并基于运行级别( AT&T Unix System 5rc
略有不同)/etc/inittab
1983年。甚至那现在已成为历史。
为您的服务管理系统创建适当的本机服务定义,无论是 nosh 工具集的服务捆绑包service-manager
、Mewburn 的脚本system-control
、systemd 的服务单元文件、Upstart 的作业文件、runit/s6/daemontools 的服务目录-encore,甚至是van Smoorenburg 的脚本。/etc/rc.d/
rc
/etc/init.d/
rc
/etc/systemd/system/
在 systemd 中,此类管理员添加的服务单元文件通常(或/usr/local/lib/systemd/system/
很少)进入。 nosh 服务管理器/var/local/sv/
是本地服务捆绑的常规场所。rc
FreeBSD 上的Mewburn使用/usr/local/etc/rc.d/
. 包装好的不过,如果您要制作服务单元文件和服务包,请放在不同的位置。
进一步阅读
- 伦纳特·珀特林等人。 (2014)。systemd-rc-本地生成器。 systemd 手册页。 Freedesktop.org。
rc.local
。 FreeBSD 系统管理员手册。 2016年4月23日。- https://unix.stackexchange.com/a/233581/5132
- 伦纳特·珀特林 (2011-08-29)。请删除
/etc/rc.local
或chmod -x
它。红帽错误#734268。 - https://unix.stackexchange.com/a/211927/5132
- 德克·施密特 (2017-12-19)。
rc.local
开始还早。系统错误 #7703 - https://wiki.archlinux.org/index.php?title=Systemd&diff=378926&oldid=378924
- 本杰明·凯恩 (2011-12-30)。 什么时候可以使用,什么时候不可以使用
rc.local
。 bencane.com。 - https://unix.stackexchange.com/a/49636/5132
- 伦纳特·珀特林 (2010-10-01)。如何将 SysV 初始化脚本转换为 systemd 服务文件?。 0pointer.de。
- https://askubuntu.com/questions/523369/
- 乔纳森·德博因·波拉德 (2015)。
/etc/inittab
已成为过去。。常见答案。 - 乔纳森·德博因·波拉德 (2014)。并排查看运行脚本和服务单元。。常见答案。
- 乔纳森·德博因·波拉德 (2014)。使用 nosh 设置和运行服务的真实示例。软件。
- 乔纳森·德博因·波拉德 (2016)。 ”
systemd.unit
手册页中缺少系统搜索路径”。systemd doco 勘误表。常见答案。
答案3
的总结https://www.linuxbabe.com/linux-server/how-to-enable-etcrc-local-with-systemd
创建/etc/systemd/system/rc-local.service:
# /etc/systemd/system/rc-local.service
[Unit]
Description=/etc/rc.local Compatibility
ConditionPathExists=/etc/rc.local
[Service]
Type=forking
ExecStart=/etc/rc.local start
TimeoutSec=0
StandardOutput=tty
RemainAfterExit=yes
SysVStartPriority=99
[Install]
WantedBy=multi-user.target
然后:
sudo touch /etc/rc.local
sudo chmod +x /etc/rc.local
sudo systemctl enable rc-local
检查:
sudo systemctl start rc-local.service
sudo systemctl status rc-local.service
答案4
克朗的 @reboot
支持仅需在系统重新启动后“很快”发生的事情,而不是作为引导过程的一部分,这可以很好地替代任何形式的关心所使用的初始化系统。
警告:它确实需要 ISC Cron。但默认情况下,它似乎比任何特定的初始化系统更普遍安装和启用。