要将定期天气更新到我的 Redis 数据库中,我尝试使用的方案如下
我有一个从相关天气 API 获取天气的 PHP 脚本。它是这样的
<?php
function getWeather()
{
if (weatherupdaterequired)
{
//weather API call
//parse and store to database
}
}
while (true)
{
getWeather();
sleep(30);
}
?>
它存储在我的/usr/local/bin
文件夹中。在同一个文件夹中,我有一个 shell 脚本,runweather
它就是这样做的:
#!/bin/sh
nohup php /usr/local/bin/echoweather.php >/dev/null 2>&1 &
我通常倾向于使用#!/bin/bash
,但在这种情况下,我发现在启动时运行 - 正如您将在下面看到的那样 - 只能#!/bin/sh
工作。我认为这与尚不可用的 bash shell 有关。
然后我创建了一个符号链接runweather
ln -s /usr/local/bin/runweather /etc/init.d/runweather
然后是另一个符号链接
ln -s /etc/init.d/runweather /etc/rc2.d/S99runweather
一些解释性说明
- 就是
/usr/local/bin/echoweather.php
在做所有真正的工作。它以 30 秒的间隔运行,不工作时休眠 - 在终止每次运行之前,它会放置一个临时 Redis 密钥
$redis-
setEx("weatherreport",29,$echoCount)`,我可以使用它来密切关注其运行状况 echoweather.php
将在启动时运行的 shell 脚本放在 中/usr/local/bin
,然后将其/etc/init.d
符号链接,然后再将其符号链接,/etc/rc2.d
可能看起来很复杂。我这样做是因为我发现如果我将实际的 shell 脚本放入/etc/init.d
然后将其符号链接到/etc/rc2.d
它不会执行。
这个方案正在奏效。我重新启动了我的服务器几次,并通过 redis-cli 在 Redis中echoweather.php
查找密钥来检查运行状况 - 始终存在且正确。weatherreport
但是,在处理 Ubuntu 启动脚本时,我是一个业余爱好者。也许有更简单的方法来做事?我非常感谢任何能够发表评论的人。