要求在执行 init.d 脚本之前启动 systemd 服务

要求在执行 init.d 脚本之前启动 systemd 服务

我在 Red Hat 7 系统上的 /etc/rc.d/init.d/ 中有一个由供应商提供的脚本。该脚本可以通过 启动和停止systemctl,但它似乎实际上并不是一个 systemd 单元文件。

该脚本依赖于在启动时由 systemd 单元文件安装的驱动器。但是,此初始化脚本尝试在安装完成之前启动,因此它总是会失败。

我尝试通过在 init 脚本的开头添加一行来进行黑客攻击,这会导致脚本在执行其余脚本之前休眠 30 秒:sleep 30

但是,睡眠功能并非始终有效。

有没有办法让这个初始化脚本依赖于正在完成的systemd挂载单元文件?除了在 init 脚本的开头添加 sleep 之外,还有什么更好的方法来完成此任务?谢谢。

答案1

SysV 初始化脚本由 systemd 自动转换为 systemd 单元文件。看man systemd-sysv-generator。您想要编辑生成的单元以为安装点添加合适的依赖项。您可以通过创建一个仅包含几行额外内容的“嵌入式”文件来完成此操作。如果你的 init 文件被调用,比如说,/etc/rc.d/init.d/mysysv那么生成的 Unit 将被调用mysysv.service。输入命令:

sudo systemctl edit mysysv

并且您应该在您选择的编辑器(设置环境变量 EDITOR)中的临时文件上。编辑文件以包含以下内容:

[Unit]
# default timeout of 90 secs for dir to be mounted
JobTimeoutSec=600
RequiresMountsFor=/path/to/mount

并干净地退出编辑器。这将创建文件/etc/systemd/system/mysysv.service.d/override.conf.当您现在启动mysysv单元时,此修改将使作业在启动之前等待最多 600 秒,直到安装点安装了某些东西。否则会因超时而失败。作业的默认等待时间是系统全局值 90 秒。

答案2

这是一个简单的模板 systemd 文件

#!/bin/bash

[Unit]
Description=license administration
After=default.target

[Service]
Type=idle
ExecStart=/root/scripts/administration.sh
TimeoutStartSec=0

[Install]
WantedBy=default.target
  • my_administration.service例如命名上面的
  • 将其定位于/etc/systemd/system/
  • 拥有权限root.root并且-rw-r--r--
  • 然后做一个systemctl daemon-reload
  • 然后执行 a systemctl list-unit-files,您将看到my_administration.service列出的
  • 做一个systemctl enable my_administration
  • 启动后,给定上述语法,一旦达到运行级别,该文件/root/scripts/administration.sh将被执行,在我的例子中是graphical.targetdefault.targetsystemctl get-default
  • 我的administration.sh文件有权限root.root并且-rwx------;它必须是可执行的明显地我手动创建该文件;这是我自定义的小脚本,用于在 Linux 完全启动后执行一些操作。

查看其他 systemd 服务文件作为参考

请参阅 Redhat 系统管理员指南,第 10 章。使用 systemd 管理服务

你想利用

[Unit]
Before=
Wants=
After=
Requires=

无论您的ExecStart=文件在某个时间发生什么,在其他服务启动之前以及在某些服务启动之后肯定会发生。不仅仅是这四个,还有许多其他您必须在系统管理员指南中查找,您需要使用它们来实现您想要的事情发生,这四个只是最常用的。

您可以在其中找到所有服务文件/usr/lib/systemd/system/以用作参考。

另请查看:https://www.digitalocean.com/community/tutorials/understanding-systemd-units-and-unit-files

还:在你的脚本中,你也可以做类似的事情

if mountpoint -q /bkup ;then /usr/bin/rsnapshot daily; fi

在我的/etc/crontab地方,我通过运行进行每日备份快照我首先执行以下操作mountpoint -q以确保我的 10tb 备份已安装,并且不会备份到根分区上未安装的文件夹并导致系统崩溃。

相关内容