我找不到在 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 在哪里,答案是创建它并授予执行权限,我认为我的问题真的不是重复的,因为我不想知道它在哪里 - 相信我,我只是想要接受它已被弃用,但我找不到做这种事情的正确方法,我真的应该为一些简单的事情创建一个单元吗?
正如在别处所指出的,
rc-local.service
在systemd
.poweroff
/命令)。reboot
rc-local.service
一种方式,但 Debian 提供了一个插入文件,它改变了至少一个重要的设置。rc-local.service
经常可以很好地工作。如果您担心上述问题,您需要做的就是制作自己的副本!这是魔术:我认为你不需要了解每一个细节[*],但这里有两件事你需要知道。
您需要使用 启用此功能
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
一旦它们完成将显示为“活动”,并且您不会启动守护程序。忘了
rc.local
。正如我所说的关于 CentOS 7、关于 Debian 8和关于 Ubuntu 15:
您正在使用 systemd+Linux 操作系统。
/etc/rc.local
是 systemd 中的双重向后兼容机制,因为它是一种机制的向后兼容机制,该机制本身就是 van Smoorenburg System 5rc
克隆中的兼容机制。使用
/etc/rc.local
可能会出错。rc.local
人们对 systemd 的运行方式并不像他们习惯的那样在引导程序中完全相同的位置运行这一事实感到惊讶。(或者错误地期望:事实上,它并没有在旧系统中最后rc.local
运行,正如 OpenBSD 手册仍然指出的那样。)其他人对他们在期待旧的做事方式时所设置的事实感到惊讶,是然后被新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 上,它被删除了3次,随后的 van Smoorenburg System 5rc
克隆随后在十多年前rc.local
被两次取代,首先是被暴发户,然后是 systemd。)还要记住迁移到 systemd 的第一条规则。
这甚至不是一个特定于 systemd 的新想法。在 van Smoorenburg
rc
和 Upstart 系统上,要做的是制作适当的 van Smoorenburgrc
脚本或 Upstart 作业文件,而不是使用rc.local
. 甚至 FreeBSD 的手册都指出,如今人们创建了一个适当的 Mewburnrc
脚本,而不是使用/etc/rc.local
. Mewburnrc
是在 2000 年由 NetBSD 1.5 引入的。/etc/rc.local
日期从第七版 Unix 和之前的时间开始。它在 1983 年被 AT&T Unix System 3 取代/etc/inittab
并基于运行级别rc
(在 AT&T Unix System 5 中略有不同/etc/inittab
)。即便如此,现在也已成为历史。service-manager
为您的服务管理系统创建适当的本机服务定义,无论是 nosh 工具集和的服务包、Mewburnsystem-control
的/etc/rc.d/
脚本、rc
systemd 的服务单元文件、Upstart 的作业文件、runit/s6/daemontools 的服务目录-encore,甚至是/etc/init.d/
van Smoorenburg 的脚本rc
。在 systemd 中,这种管理员添加的服务单元文件
/etc/systemd/system/
通常(或/usr/local/lib/systemd/system/
很少)进入。使用 nosh 服务管理器,/var/local/sv/
是本地服务包的常规位置。FreeBSD 上的Mewburnrc
使用/usr/local/etc/rc.d/
. 打包的服务单元文件和服务包,如果你正在制作它们,可以放在不同的地方。进一步阅读
rc.local
. FreeBSD 系统管理员手册。2016-04-23。/etc/rc.local
或chmod -x
它。红帽错误 #734268。rc.local
开始早了。系统错误 #7703rc.local
. bencane.com。/etc/inittab
已成为过去。. 经常给出答案。systemd.unit
”。systemd doco 的勘误表。经常给出答案。https://www.linuxbabe.com/linux-server/how-to-enable-etcrc-local-with-systemd总结
创建/etc/systemd/system/rc-local.service:
然后:
检查: