我想每晚将服务器 A 的“热克隆”“热克隆”到服务器 B。建议服务器 B 在此操作期间运行最少的守护进程,因此我想创建一个“最小”运行级别,它几乎只运行 sshd 并切换到/从该运行级别中间脚本中的运行级别,即:
# do some stuff ...
# take services down
telinit 2
# do backup ...
# bring services back up
telinit 3
# do post-backup stuff ...
Run Code Online (Sandbox Code Playgroud)
我想做一个运行级别切换,而不是显式启动/停止服务,这样我就可以在许多不同配置的机器上使用相同的脚本(不同的服务,一些在 systemv-init 上,一些在 systemd 上)。我想将其全部保存在一个脚本中以实现可维护性,而不是创建一堆新的 initd/systemd 启动/停止脚本。
所以问题的本质是: * telinit 会停止脚本吗(假设 cron 在两个运行级别中)?* telinit 是等待完成还是立即返回?* 如果上述工作是“安全的”,或者该方法是否存在潜在问题?* 是否有更好的方法可以使用单个脚本(同样,我更愿意避免安装一堆新的 init 脚本,因此这个东西在很大程度上是“独立的”和可移植的)
我创建了以下脚本
#!/bin/bash
date
who -r
/sbin/telinit 2
who -r
/sbin/telinit 3
who -r
date
Run Code Online (Sandbox Code Playgroud)
并将其安装在 cron 中
* * * * * /home/iain/test &>>/tmp/test.out
Run Code Online (Sandbox Code Playgroud)
这是输出
Thu Mar 20 03:06:01 EDT 2014
run-level 3 2014-03-20 03:05 last=2
run-level 2 2014-03-20 03:06 last=3
run-level 3 2014-03-20 03:06 last=2
Thu Mar 20 03:06:01 EDT 2014
Run Code Online (Sandbox Code Playgroud)
如您所见,脚本一直在运行。至于它的安全性,您只能根据您在环境中的测试来决定。
小智 5
在较旧的 HP-UX 系统上,我们曾经使用运行级别更改每晚对数据库进行冷备份。我们在运行级别 4 启动和停止数据库,基本上做了一个 telinit 3,拍摄磁盘快照,telinit 4,开始备份磁盘。这是一种与您所看到的略有不同的策略,但对于所有意图和目的,它的行为都是相同的。