【发布时间】:2020-07-03 17:55:23
【问题描述】:
我在 Raspberry Pi 4 上有一个 LAMP 服务器,其网页正在对重新启动 pi 的 php 脚本进行 AJAX 调用。我的脚本回显了一个返回到网页的 JSON 字符串响应,表明它正准备重新启动,然后它执行“sudo reboot”命令。该脚本 100% 的时间运行并始终重新启动,但在 pi 重新启动之前并不总是完全传输回显,这会导致错误。
示例代码:
<?php
... other code
$tags['status'] = "restarting";
echo json_encode($tags);
$cmd = "sudo reboot";
exec($cmd);
?>
我尝试在回显之后添加一个 sleep() 语句,但这会暂停整个脚本并且直到睡眠之后才会回显。我还尝试将 sleep 添加到 exec 命令中,例如“sleep 5; sudo reboot”,但这也不起作用。
如果我注释掉重新启动语句,我会在 100% 的时间内得到回显响应。这告诉我我有时间问题。有没有办法确保在重新启动之前完全处理回显?
我已经搜索了答案,但没有找到任何有用的东西。
【问题讨论】:
-
如果脚本只重启,在ajax调用前发出通知。
-
大部分是猜测,但您可以将延迟放在命令中而不是 PHP 代码中。类似:
$cmd = "sleep 1 && sudo reboot";您可能还需要重定向输出和/或发送到后台以防止exec()等待。类似:$cmd = "sleep 1 && sudo reboot > /dev/null &";(那时sleep可能不再需要,或者可能永远不需要。正如我所说,这些主要是我目前没有方便的测试方法的猜测。) -
sudo shutdown -r +5这应该在 pi 上工作以在 5 分钟后关闭机器,也许这也适用于重新启动。 raspberrypi.org/forums/viewtopic.php?t=159745 -
我曾经有过类似的事情并决定使用 2 个 ajax 调用: 1 执行任务并发送关闭消息。 2 收到消息后,显示并等待几秒钟,然后发送请求重新启动。阻止了比赛条件。
-
@Michel 我决定尝试您的建议,即等待一小段时间然后发送重启请求,而不用担心响应。这很好用。我确实在重启脚本中添加了一个 for 循环,该循环循环 1000 次,每次我运行 usleep(1000) 以休眠 1 毫秒。我大部分时间都在看到响应。因此,无论哪种方式,脚本都可以正常工作。感谢您和其他人的建议!
标签: javascript php ajax raspberry-pi