咖啡因

咖啡因

我想让 rsync 在开启交流电源的情况下通过 wifi 工作数小时。但当我这样做时,Mac 会在一段时间后断开连接。

在“能源设置”窗格上,它被配置为“计算机永不睡眠”、“尽可能使硬盘进入睡眠状态”和“唤醒以进行网络访问”。

另外,如果 Mac 在任务完成后能够真正进入睡眠状态,那就太好了。

我意识到一个非常相似的之前已经问过这个问题并且有时间设置失眠X,但我不希望机器失眠。我不想继续安装越来越多的扩展,也不想每次都通过 pmset 进行调整。

我希望它能够像预期的那样运行 - 当我让它运行任务时保持唤醒状态,然后“在可能的情况下”进入睡眠状态。这次是由于 rsync,但下一次可能是其他原因。

我是不是像往常一样期望过高?我能修好它吗?它坏了吗?

答案1

咖啡因

例如:

caffeinate -i rsync -avz someuser@somehost:somefolder /some/local/folder

从手册页中:

EXAMPLE
     caffeinate -i make
        caffeinate forks a process, execs "make" in it, and holds an
        assertion that prevents idle sleep as long as that process
        is running.

它还可以用于诸如“观看这部电影时不要让显示器进入睡眠状态”等情况:

caffeinate -d # in effect until you hit Ctrl+C

...或“在接下来的 10,000 秒内保持清醒”:

caffeinate -t 10000

man caffeinate参阅详情。

答案2

吉格勒可以设置为仅在鼠标运行时“摇动”鼠标。这将防止屏幕和计算机进入睡眠状态。这在盖子关闭的笔记本电脑上不起作用。为此,您需要 InsomniaX 或其他基于 kext 的应用程序。

在此处输入图片描述

答案3

另一种选择是咖啡因。这是一个应用程序(而不是扩展程序),可以让机器在指定的一段时间内保持“活动状态”,之后机器可以执行其通常所做的任何操作:空白、运行屏幕保护程序、睡眠等。也就是说,它不会让您的机器进入睡眠状态,但会让它进入睡眠状态。它似乎在功能上等同于在您要求的时间段内将节能设置设置为“从不”,然后在之后恢复它们。

在此处输入图片描述

答案4

您可能考虑制作一个保持打开的 Applescript 应用程序,该应用程序根据正在运行的进程的存在来设置/重置睡眠定时器。创建 launchd plist 也是一个可行的解决方案,但是我对语法仍然不太确定。“pmset force sleep X”命令不需要 root 访问权限,但设置在重启时会重置。

由于您的情况听起来好像我无法预测您的每一个需求,所以我会为您勾勒出一些轮廓。

property LoopTime: 5 --measured in seconds
property normalSleepTimeout: 30 --measured in minutes
property processName: "rsync"  --the name of the process you're trying to find

on run
   do shell script "pmset force sleep 0"  --disables sleep
   idle()
end

on idle
   if not appIsRunning() then 
      do shell script ("pmset force sleep " & normalSleepTimeout as string) -- sets sleep to desired idle timeout
      quit
   end
   return 
end

on appIsRunning()
   --Here's where you need to do the test that an app is running.  True needs to mean "the app is running".  Store the value to "result" or change the below return statement.

   return result
end

对于 rsync 和后台进程之类的事情,您需要变得更加聪明并轮询其他功能,例如 $ top。

set result to False
if 0 < (count of (do shell script ("top -l 1 | grep" & processName as string))) then
   set result to True
end

请注意,在上述情况下,如果 rsyncd 正在运行,则仅搜索“rsync”将返回误报,因为“rsync”和“rsyncd”都匹配。如果这对您不起作用,您可能需要采取更棘手的措施。

如果应用程序是一个窗口进程,我将使用以下命令确定正在运行的内容:

tell application "System Events" to set RunningAppNames to name of processes

或者对于包标识符(更精确)

tell application "System Events" to set RunningBundles to bundle identifier of processes

告诉我更多关于您的场景的信息,我会尝试编写一些更精确且具有更灵活的用户界面的内容。

相关内容