在 cron 脚本中更改运行级别是否安全?

在 cron 脚本中更改运行级别是否安全?

我想每晚将服务器 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,开始备份磁盘。这与您所看到的策略略有不同,但就所有意图和目的而言,它的行为都是一样的。

相关内容