在OS X 10.11上,Sleepwatcher无法在唤醒时执行脚本

3

我在OS X 10.11上安装了Sleepwatcher 2.2,并通过LaunchD作为代理启动它。

它可以正常启动并在活动监视器中显示。

但是,当电脑唤醒时,我希望它能够触发一个Python脚本。

我的安装命令如下。

sudo mkdir -p /usr/local/sbin /usr/local/share/man/man8
sudo cp ~/Desktop/sleepwatcher_2.2/sleepwatcher /usr/local/sbin
sudo cp ~/Desktop/sleepwatcher_2.2/sleepwatcher.8 /usr/local/share/man/man8
sudo cp ~/Desktop/sleepwatcher_2.2/sleepwatcher/config/rc.sleep /etc
sudo cp ~/Desktop/sleepwatcher_2.2/sleepwatcher/config/rc.wakeup /etc
sudo cp ~/Desktop/sleepwatcher_2.2/sleepwatcher/config/de.bernhard-baehr.sleepwatcher-20compatibility-localuser.plist /Library/LaunchAgents

chmod +x /etc/rc.sleep
chmod +x /etc/rc.wakeup
chmod +x /usr/local/bin/test.py

我的 rc.wakeup 文件内容如下。

#!/bin/sh
/usr/local/bin/python3 /usr/local/bin/test.py

当在终端窗口输入以下命令来执行Sleepwatcher时,它似乎可以正常工作。
/usr/local/sbin/sleepwatcher --verbose --wakeup /usr/local/bin/test.py 

然而,当我尝试将其作为启动项在LaunchD下运行时,似乎无法执行我的Python脚本。

我已经搜索了所有内容,但仍然无法弄清楚为什么在LaunchD中启动时它不起作用。

有人遇到过这种问题吗?

提前感谢。


是的,我输入了chmod +x /etc/rc.sleep命令。我不确定为什么上面会有一个额外的空格。 - user1709730
您似乎缺少对plist的注册,这是启动sleepwatcher所需的,并在发生睡眠和唤醒事件时实际调用/etc/rc.sleep/etc/rc.wake脚本的必要条件。 - Anya Shenanigans
嗨,Petesh,我重新启动了服务器,而不是执行“launchctl load /Library/LaunchAgents/de.bernhard-baehr.sleepwatcher-20compatibility-localuser.plist”命令。这样也可以让它起作用,而且它确实起作用了。你知道是否有任何日志留下来,以便我可以查看在加载期间或唤醒事件期间脚本执行时可能出现的错误? - user1709730
事实证明,上述内容并没有问题,问题出在使用的其中一个文件中。 - user1709730
1个回答

3

我遇到了类似的问题,所以我采用了另一种方法,使用另一个名为Hammerspoon的开源工具。它可以在MacOS上自动化许多事情,包括睡眠/唤醒事件。通过在Hammerspoon的~/.hammerspoon/init.lua(或创建一个'spoon')脚本中添加以下内容,就可以很容易地复制sleepwatcher的功能,并在机器唤醒或休眠时调用相应的唤醒和休眠脚本(例如在/Users/用户名/scripts中-请确保更改用户名)从sleepwatcher:

function caffeinateWatcher(eventType)
    if (eventType == hs.caffeinate.watcher.systemWillSleep or
            eventType == hs.caffeinate.watcher.systemWillPowerOff) then
            print ("WillSleep...")
            -- Execute sleep script
            hs.task.new("/Users/username/scripts/rc.sleep", nil):start()
    elseif (eventType == hs.caffeinate.watcher.systemDidWake) then
            print ("Woken...")
            -- Execute wake script
            hs.task.new("/Users/username/scripts/rc.wake", nil):start()
    end
end

sleepWatcher = hs.caffeinate.watcher.new(caffeinateWatcher)
sleepWatcher:start()

请注意,如果您希望Hammerspoon启动shell脚本,您需要确保它们以标准bash shell头部#!/bin/bash开头。


我在我的公司使用您的示例运行一些脚本。谢谢。这有点困难,因为在启用脚本的某些日志之前,不清楚他能否找到路径。谢谢。 - Federico Galli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接