在任务/应用程序运行时保持Mac OSX的正常运行


10

我想让rsync在wifi上工作几个小时才能打开AC电源。但是,当我这样做时,Mac会在一段时间后断开连接。

在“能源设置”窗格上,将其配置为“计算机永不休眠”,“尽可能使硬盘进入休眠状态”和“唤醒网络访问权限”。

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

我意识到之前有人问过一个非常类似的问题,里面有pmsetinsomniaX,但是我不想让机器失眠。而且我不想继续安装越来越多的扩展,也不必每次都对pmset进行调整。

我希望它本来可以按预期方式运行-在让它运行任务的同时保持清醒状态,然后“尽可能”进入睡眠状态。这次是由于rsync引起的,但是下次可能是其他情况了。

我是否像往常一样期待太多?我可以解决吗?它甚至坏了吗?

Answers:


10

咖啡因

例如:

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
这真是太棒了!这是OSX上的默认设置吗?从哪个版本开始?(我无法快速找到有关此信息)
cregox

@Cawas-根据这篇文章,它开始与Mountain Lion一起发货:cnet.com/news/…我从中找到了有关它的信息man pmset,该noidle选项被列为已弃用。
内森·朗

另外,看到这个漂亮的教程:computers.tutsplus.com/tutorials/...
内森龙

4

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

在此处输入图片说明


没关上盖子,很好。我不要过热
cregox

确实方便一些小的应用程序。
ayaz 2010年

好吧,虽然我不再需要它了,但这实际上解决了我的问题,而且似乎是一个不错的解决方案。我想我应该早就接受它了。
cregox

2

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

在此处输入图片说明


但是您仍然必须启动和停止该应用程序。您无法设置它并且忘记了。
乔什(Josh K)2010年

1

您可能会考虑制作一个“保持开放Applescript”应用程序,该应用程序根据正在运行的进程的存在来设置/重置睡眠计时器。创建启动的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”都匹配。如果这不适合您,则可能需要变得更加棘手。

如果该应用程序是一个Windowed进程,那么我将使用以下命令确定正在运行的程序:

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

或用于捆绑包标识符(更精确)

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

告诉我更多有关您的方案的信息,我将尝试用更灵活的用户界面编写更精确的内容。


大坝,我下次再看你在这里说的话,但感谢您渡过所有的麻烦!不过,我现在还没有真正考虑编写脚本。:)
cregox

感谢您将我的答案恢复为非负值。我靠脚本生活。我对BASH感到很糟糕,但是我绝对喜欢AppleScript并从中运行终端命令。
dotHTM'3
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.