如何确保脚本在一个服务停止之后但在另一个服务停止之前执行?

如何确保脚本在一个服务停止之后但在另一个服务停止之前执行?

我应该在服务器关闭时运行特定的脚本,确保某些服务始终停止,而其他一些但必需的服务仍然运行。

实践中:我应该在同一台主机上的 Web 服务器关闭后运行备份脚本,对 MySQL 数据库进行快照(确保数据库处于一致状态)。我还应该确保在备份脚本将文件传输到另一台主机时网络可用。

我尝试创建一个 upstart 任务,其中包含以下节:

start on (stopped apache2 and stopping mysql and net-device-up IFACE=eth0)

然而这个脚本从未运行过。

我需要哪些代码段来确保脚本正确运行?或者使用 upstart 是否可行?

更新:我测试过的操作系统是 Ubuntu 11.04 (natty)

答案1

重要的是要记住,upstart 是一个事件驱动系统,而不是基于依赖的系统。

因此使用“and”可能很危险。你要求 upstart 等到所有这些事件发生后才开始你的工作。

所以第一的发出 net-device-up IFACE=eth0 时(如果是服务器,则在启动期间;如果是笔记本电脑,则在插入电源时,并由 NetworkManager 管理),这将是第一个条件。然后 upstart 将等待,直到 apache2 停止。如果您使用的是系统 apache2 脚本,则永远不会发出该事件,因为它位于 /etc/init.d 中,并且不会发出启动/已启动/停止/已停止事件。

你可能想要的是这个:

start on stopping mysql
task
pre-start script
  if service apache2 status ; then
     exit 0
  fi
  exec /my/backup/script
end script

请注意任务上面很重要。它告诉 upstart,直到主脚本退出,此作业才“完成”。这样,mysql 的停止事件将阻止此作业,直到完成为止。对 apache2 的检查可能不正确。因为我不确定如果 mysql 停止时 apache2 仍在运行,您想做什么。事实上,这两个事件没有协调,实际上是在系统关闭期间并行发生的,因此如果您希望它们协调,您可能需要另一个 upstart 作业来停止/启动 apache2。这就足够了

start on started mysql
stop on stopping mysql

pre-start exec /etc/init.d/apache2 start
post-stop exec /etc/init.d/apache2 stop

您还需要删除正常的链接update-rc.d -f apache2 remove。我建议将其命名为 apache2-upstart 之类的名称,这样就不会混淆服务命令。

相关内容