要将定期天气更新到我的 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 启动脚本时,我是一个业余爱好者。也许有更简单的方法来做事?我非常感谢任何能够发表评论的人。
如果您没有运行 EOL 版本的 Ubuntu,那么您的 init 系统已经是基于 systemd 的,因此使用它是正确的方法。有些人可能会告诉您使用
Type=idle
您的服务单元,但请:(来自systemd 手册页):考虑到这一点,我们应该通过设置目标和依赖关系来管理我们的服务排序。要使脚本正常工作,您至少有三个重要要求:
确定了这些要求后,让我们看一下systemd 目标,以便我们知道我们想要什么、需要什么以及应该依赖或等待什么:
network-online.target
,所以我们的单元Wants
应该只运行After
这个目标;multi-user.target
设置一个多用户系统并在完成所需的一切后完成,因此该单元可能Wants
就是WantedBy
它。因为我们真的希望我们的单元在启动过程中运行较晚,所以运行它After
这个目标也是我们想要的;Requires
Redis 正在运行,我们应该只加载After
它。考虑到这一点,我们可以将所有这些考虑在内的
echoweather.service
文件写入:/etc/systemd/system/
完成后,重新加载您的守护程序文件,启用您的服务单元并运行您的进程: