我在供应商提供的 Red Hat 7 系统上的 /etc/rc.d/init.d/ 中有一个脚本。该脚本可以通过 启动和停止systemctl
,但实际上它似乎不是一个 systemd 单元文件。
该脚本取决于系统单元文件在引导时安装的驱动器。然而,这个初始化脚本试图在挂载完成之前启动,所以它总是失败。
我尝试通过在 init 脚本的开头添加一行来进行破解,这会导致脚本在脚本的其余部分执行之前休眠 30 秒:sleep 30
.
但是,睡眠功能并非一直有效。
有没有办法让这个初始化脚本依赖于正在完成的 systemd 挂载单元文件?除了在初始化脚本的开头添加睡眠之外,还有什么更好的方法来完成此任务?谢谢。
SysV 初始化脚本由 systemd 自动转换为 systemd 单元文件。见
man systemd-sysv-generator
。您想编辑生成的 Unit 以为安装点添加合适的依赖项。您可以通过创建一个仅包含几行额外行的“插入式”文件来做到这一点。如果您的 init 文件被调用,例如,/etc/rc.d/init.d/mysysv
那么生成的 Unit 将被调用mysysv.service
。输入命令:并且您应该在您选择的编辑器(设置环境变量 EDITOR)中的临时文件中。编辑文件以包含以下内容:
并干净地退出编辑器。这将创建文件
/etc/systemd/system/mysysv.service.d/override.conf
. 当您现在启动mysysv
单元时,此修改将使作业等待最多 600 秒,直到安装点安装了某些东西,然后再启动。否则它会因超时而失败。作业的默认等待时间是 90 秒的系统全局值。这是一个裸骨模板systemd文件
my_administration.service
例如上面的名字/etc/systemd/system/
root.root
和-rw-r--r--
systemctl daemon-reload
systemctl list-unit-files
,你会看到my_administration.service
列出systemctl enable my_administration
/root/scripts/administration.sh
一旦达到运行级别,文件将被执行,default.target
在我的情况下是graphics.target persystemctl get-default
administration.sh
文件有权限root.root
和-rwx------
;它显然必须是可执行的,并且我手动创建的那个文件;这是我在 linux 完全启动后自定义的小脚本。查看其他 systemd 服务文件作为参考
请参阅 redhat 系统管理员指南,第 10 章。使用 systemd 管理服务
你想利用
无论您的
ExecStart=
文件在某个时间发生什么,都可以得到它……在其他服务启动之前以及在某些服务启动之后。不仅仅是这四个,还有很多其他的,您必须在系统管理员指南中查找,您需要使用这些指南来实现您想要的事情发生,这四个只是最常用的。您可以在其中找到所有服务文件
/usr/lib/systemd/system/
以用作参考。另请查看:https ://www.digitalocean.com/community/tutorials/understanding-systemd-units-and-unit-files
另外:在你的脚本中,你也可以做类似的事情
在我通过运行rsnapshot
/etc/crontab
进行每日备份的地方,我首先执行一个以确保我的 10tb 备份已安装,并且我不会备份到根分区上未安装的文件夹并导致系统崩溃。mountpoint -q