如何在Hammerspoon初始化中实现定期任务?

我认为当我的网络连接断开或恢复时得到通知会很好,所以我将以下代码放在我的Hammerspoon init.lua中:


ping = nil
previousStatus = nil
function pingCallback(server, eventType, ...)
  hs.alert.show(eventType)

  if eventType == "receivedPacket"
  then
    newStatus = "success"
  else
    if eventType == "didFail" or eventType == "sendPacketFailed"
    then
      newStatus = "failure"
    end
  end

  if not (newStatus == previousStatus)
  then
    hs.alert.show(string.format("网络状态已更改为%s", newStatus))
    previousStatus = newStatus
  end
end

while(true)
do
  ping = hs.network.ping.ping("google.com", 5, 1.0, 2.0, "any", pingCallback)
  os.execute("sleep 15")
end

问题在于睡眠功能。 它会使Hammerspoon本身停止工作。 我真正需要的是一个线程或计时器,或者可能要启动不同的操作系统进程。 我该怎么做?

点赞
用户1100925
用户1100925

Hammerspoon有一个计时器。你可以用以下代码替换你的while循环:

function pingGoogle()
  hs.network.ping.ping("google.com", 5, 1.0, 2.0, "any", pingCallback)
end

googlePinger = hs.timer.new(15, pingGoogle)
googlePinger:start()

还有一些要考虑的事情:

  • 基于 Network Reachability 启动/停止ping计时器。如果到ping目标的路线不存在,就没有必要使用ping轮询。

  • HTTP GET 到大厂商用于自己的网络连通性检查的端点。

    • Google: http://clients3.google.com/generate_204 - 应该有一个 204 响应码(我看到使用这个检查器的人也会检查响应内容长度为0)。
    • Microsoft: http://www.msftncsi.com/ncsi.txt - 应该有一个 200 响应码,并且响应正文应该显示 "Microsoft NCSI"。
2020-05-26 16:04:39