我有一个在 Rackspace 上运行的客户端,它们有三个完全同步的服务器,我使用 wget 在 crontab 中添加了一堆 crons,使用 wget 获取 cron 的网址(同步到每个服务器)。当您访问客户端的域时,负载均衡器会为您服务。
我只想在一台特定服务器 (web01) 上运行一次 crons
问题是,当每台服务器运行 crontab 时,每台服务器都会运行 x3。因此,我在 PHP 中检查主机名是否为 web01 以外的其他名称,但是由于我们使用 WGET 并且它们通过负载均衡器运行,我们发现 LB 向 web01 发送两个请求,另一个向 web01 发送两个请求。到 web02 或 web03。
我认为这需要完全在 crontab 中完成,检查当前服务器是否为 web01 并在 IF 语句内运行 cron 作业,否则什么也不做,但我不完全确定用 IF 表达这一点的最佳方式陈述。
答案1
您拥有三台配置几乎相同的服务器,但您只想cron
在其中一台上运行作业?
让我们遵循您的服务器命名方案:web01
、web02
和web03
。我使用的是shell脚本,但原理与PHP完全相同。 (我可以随意使用 PHP,但我认为自己还不够精通,无法公开编写它。)
在每个脚本的顶部附近,cron
您可以执行类似的操作,这将导致脚本退出,除非服务器名称为web01
。
[ web01 != "$(hostname)" ] && exit
面对服务器中断时,这不是很有弹性。如果web01
死亡,您可能想在另一台服务器上接手cron
工作。假设您有权访问 DNS,您可以为负责运行cron
.这是bind
;的示例条目其他系统也类似:
cron.contoso.com 300 IN CNAME web01.contoso.com
然后,您可以使用 或dig
来nslookup
将服务器名称与别名进行比较,并且在五分钟(300 秒)内您可以将职责交换cron
到另一台服务器:
myaddr="$(nslookup "$(hostname)" | awk '$1=="Address:"{a=$2} END{print a}')"
cronaddr="$(nslookup "$(hostname)" | awk '$1=="Address:"{a=$2} END{print a}')"
[ "$myaddr" != "$cronaddr" ] && exit
或者:
myaddr="$(dig +short "$(hostname).contoso.com")"
cronaddr="$(dig +short cron.contoso.com)"
[ "$myaddr" != "$cronaddr" ] && exit