我想每晚将服务器 A “热克隆”到服务器 B。建议服务器 B 在此操作期间运行最少的守护进程,因此我想创建一个“最小”运行级别,该运行级别几乎只运行 sshd 并在脚本中间切换到/从该运行级别,即:
# do some stuff ...
# take services down
telinit 2
# do backup ...
# bring services back up
telinit 3
# do post-backup stuff ...
我想进行运行级别切换,而不是明确启动/停止服务,这样我就可以在多台配置不同的机器上使用相同的脚本(不同的服务,一些在 systemv-init 上,一些在 systemd 上)。我想将所有内容保存在一个脚本中,以便于维护,而不是创建一堆新的 initd/systemd 启动/停止脚本。
因此,问题的本质是:* telinit 会停止脚本吗(假设 cron 处于两个运行级别)?* telinit 是等待完成还是立即返回?* 如果上述方法有效,那么这样做是否“安全”?还是说这种方法存在潜在问题?* 有没有更好的方法可以使用单个脚本(再次强调,我更愿意避免安装一堆新的 init 脚本,这样这个东西基本上是“自包含”且可移植的)
答案1
我创建了以下脚本
#!/bin/bash
date
who -r
/sbin/telinit 2
who -r
/sbin/telinit 3
who -r
date
并将其安装在 cron 中
* * * * * /home/iain/test &>>/tmp/test.out
它的输出
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
如您所见,脚本一直在运行。至于其安全性,只有您根据自己环境中的测试才能决定。
答案2
在较旧的 HP-UX 系统上,我们过去常常使用运行级别更改每晚对数据库进行冷备份。我们让数据库在运行级别 4 启动和停止,基本上执行 telinit 3,拍摄磁盘快照,执行 telinit 4,开始备份磁盘。这与您所看到的策略略有不同,但就所有意图和目的而言,它的行为都是一样的。