我在 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.target
systemctl 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 备份已安装,并且不会备份到根分区上未安装的文件夹并导致系统崩溃。