AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 471824
Accepted
Luciano Andress Martini
Luciano Andress Martini
Asked: 2018-09-28 05:04:02 +0800 CST2018-09-28 05:04:02 +0800 CST 2018-09-28 05:04:02 +0800 CST

systemd 中 rc.local 的正确替代品是什么,而不是重新创建 rc.local

  • 772

我找不到在 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 在哪里,答案是创建它并授予执行权限,我认为我的问题真的不是重复的,因为我不想知道它在哪里 - 相信我,我只是想要接受它已被弃用,但我找不到做这种事情的正确方法,我真的应该为一些简单的事情创建一个单元吗?

systemd rc.local
  • 3 3 个回答
  • 60046 Views

3 个回答

  • Voted
  1. Best Answer
    sourcejedi
    2018-11-05T09:54:26+08:002018-11-05T09:54:26+08:00

    正如在别处所指出的,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.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:

    1. 您需要确保您的命令不会与试图控制同一事物的另一个程序冲突。
    2. 最好不要从rc.local.

    [*] 我使用Type=oneshot+RemainAfterExit=yes是因为它对大多数一次性脚本更有意义。它正式表明您将运行一系列命令,my-startup一旦它们完成将显示为“活动”,并且您不会启动守护程序。

    • 38
  2. JdeBP
    2018-09-28T08:06:23+08:002018-09-28T08:06:23+08:00

    忘了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 Smoorenburgrc和 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/脚本、rcsystemd 的服务单元文件、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/. 打包的服务单元文件和服务包,如果你正在制作它们,可以放在不同的地方。

    进一步阅读

    • Lennart Poettering 等人。(2014)。systemd-rc-local-generator。systemd 手册页。自由桌面.org。
    • rc.local. FreeBSD 系统管理员手册。2016-04-23。
    • https://unix.stackexchange.com/a/233581/5132
    • Lennart Poettering (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
    • Lennart Poettering (2010-10-01)。如何将 SysV 初始化脚本转换为 systemd 服务文件?. 0pointer.de。
    • https://askubuntu.com/questions/523369/
    • 乔纳森·德博因·波拉德 (2015)。 /etc/inittab已成为过去。. 经常给出答案。
    • 乔纳森·德博因·波拉德 (2014)。并排查看运行脚本和服务单元。. 经常给出答案。
    • 乔纳森·德博因·波拉德 (2014)。一个使用 nosh 设置和运行服务的真实示例。软件。
    • 乔纳森·德博因·波拉德 (2016)。“手册页中缺少系统搜索路径systemd.unit”。systemd doco 的勘误表。经常给出答案。
    • 20
  3. Ole Tange
    2019-10-03T11:28:01+08:002019-10-03T11:28:01+08:00

    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
    
    • 6

相关问题

  • journalctl 中的区分级别

  • 将默认编辑器更改为 vim for _ sudo systemctl edit [unit-file] _

  • systemd:如何在服务启动时运行脚本,而不编辑服务定义

  • 使用 systemd 看门狗支持重新启动应用程序

  • 使用键盘快捷键启动/停止 systemd 服务 [关闭]

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve