【问题标题】:AJAX Response Lost Just Before Restarting Raspberry PiAJAX 响应在重新启动 Raspberry Pi 之前丢失
【发布时间】: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 &amp;&amp; sudo reboot"; 您可能还需要重定向输出和/或发送到后台以防止exec() 等待。类似:$cmd = "sleep 1 &amp;&amp; sudo reboot &gt; /dev/null &amp;";(那时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


【解决方案1】:

我曾经有过类似的事情,并决定使用 2 个 ajax 调用:

  1. 执行任务并返回关闭消息。
  2. 当消息 收到,显示并等待几秒钟,然后发送请求到 重启。

这阻止了竞争条件。

【讨论】:

    猜你喜欢
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-30
    • 2022-11-10
    • 2015-08-11
    • 2016-12-29
    • 2020-10-10
    相关资源
    最近更新 更多