把...忘了吧rc.local。

把...忘了吧rc.local。

我找不到执行某些操作的正确方法当地的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

  1. 理论上,您的发行版可能不会启用它。 (我认为这并不常见,例如因为禁用相同的构建选项也会删除很多人使用的poweroff/命令)。reboot
  2. 语义并不完全清楚。 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

我认为您不需要了解每一个细节[*],但这里您需要了解两件事。

  1. 您需要使用 来启用此功能systemctl enable my-startup.service

  2. 如果您的脚本依赖于任何其他服务(包括 )network-online.target,则必须声明它。例如,添加一个[Unit]部分,其中包含行Wants=network-online.targetAfter=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

  1. 您需要确保您的命令不会与试图控制同一事物的另一个程序发生冲突。
  2. 最好不要从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 的第一条规则

这甚至不是 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/inittab1983年。甚至现在已成为历史。

为您的服务管理系统创建适当的本机服务定义,无论是 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/是本地服务捆绑的常规场所。rcFreeBSD 上的Mewburn使用/usr/local/etc/rc.d/. 包装好的不过,如果您要制作服务单元文件和服务包,请放在不同的位置。

进一步阅读

答案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。但默认情况下,它似乎比任何特定的初始化系统更普遍安装和启用。

相关内容