Mantener Mac OSX activo y sin dormir mientras se ejecuta la tarea / aplicación

10

Quiero dejar rsync funcionando a través de wifi durante horas encendidas con alimentación de CA. Pero cuando lo hago, la Mac rompe la conexión después de un tiempo.

En el panel de Configuración de energía está configurado para "La computadora nunca duerme", "Poner el disco duro a dormir cuando sea posible" y "Activar para acceso a la red".

Además, sería bueno si el Mac realmente se duerme una vez que se realiza la tarea.

Me doy cuenta de que se ha hecho una pregunta muy similar antes y que hay pmset e insomnioX , pero no quiero que la máquina se quede sin dormir . Y no quiero seguir instalando más y más extensiones, ni tener que modificar pmset cada vez.

Quiero que se comporte de forma nativa como se esperaba: permanezca despierto mientras lo dejo ejecutando una tarea y luego me duermo "cuando sea posible". Esta vez se debe a rsync, pero la próxima vez podría ser otra cosa.

¿Estoy esperando demasiado como de costumbre? ¿Puedo arreglarlo? ¿Está incluso roto?

cregox
fuente

Respuestas:

10

Cafeína

Por ejemplo:

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

Desde la página del manual:

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.

También se puede usar para situaciones como "no dejes que la pantalla duerma mientras estoy viendo esta película":

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

... o "mantente despierto por los próximos 10,000 segundos":

caffeinate -t 10000

Ver man caffeinatepara más detalles.

Nathan Long
fuente
2
¡Esto es increíblemente increíble! ¿Es esto predeterminado en cualquier OSX? ¿Desde qué versión? (No pude encontrar rápidamente información sobre esto)
cregox
@Cawas: según este artículo, comenzó a enviarse con Mountain Lion: cnet.com/news/… Me enteré desde allí man pmset, donde la noidleopción aparece como obsoleta.
Nathan Long
Además, vea este bonito tutorial: computers.tutsplus.com/tutorials/…
Nathan Long
4

Jiggler se puede configurar para que solo "mueva" el mouse cuando se esté ejecutando. Esto evitará que la pantalla y la computadora duerman. Esto no funcionará en una computadora portátil con la tapa cerrada. Para eso necesitarías InsomniaX u otra aplicación basada en kext.

ingrese la descripción de la imagen aquí

Josh K
fuente
Sin tapa cerrada, está bien. No quiero sobrecalentarme.
cregox
Práctica pequeña aplicación, de hecho.
ayaz
Bueno, aunque no lo necesito nuevamente, esto realmente resolvió mi problema, y ​​parece una buena solución. Supongo que debería haberlo aceptado mucho antes.
cregox
2

Otra alternativa es la cafeína . Es una aplicación, no una extensión, que mantiene la máquina "activa" durante un período de tiempo específico, después de lo cual la máquina puede hacer lo que haría normalmente: quedarse en blanco, ejecutar salvapantallas, dormir, etc. Es decir, ganó " No ponga su máquina en reposo, pero lo dejará. Parece funcionalmente equivalente a configurar los ajustes de ahorro de energía en "nunca" durante el período que solicita y restaurarlos después.

ingrese la descripción de la imagen aquí

JRobert
fuente
Pero aún debe iniciar y detener la aplicación. No puedes configurarlo y olvidarlo.
Josh K
1

Puede considerar crear una aplicación Applescript Stay-Open que establezca / restablezca el temporizador de reposo en función de la existencia de un proceso en ejecución. Crear una lista de lanzamiento también es una solución viable, sin embargo, todavía tengo dudas sobre la sintaxis. El comando "pmset force sleep X" no requiere acceso de root, pero la configuración se restablece al reiniciar.

Dado que su situación parece que no podré anticipar todas sus necesidades, esbozaré algo para usted.

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

Para cosas como rsync y procesos en segundo plano, necesitará ser más inteligente y sondear otras funciones como $ 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

Tenga en cuenta que en el caso anterior, la búsqueda de "rsync" arrojará un falso positivo si rsyncd se está ejecutando porque "rsync" y "rsyncd" coinciden. Es posible que tenga que ser más complicado si esto no funciona para usted.

Si la aplicación fuera un proceso de Windows, usaría lo siguiente para determinar qué se está ejecutando:

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

O para identificadores de paquete (más precisos)

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

Cuéntame más sobre tu escenario e intentaré escribir algo más exacto y con una interfaz de usuario más flexible.

dotHTM
fuente
Dam, veré todo lo que dijiste aquí en otra ocasión, pero gracias por pasar por todos estos problemas. Sin embargo, no estoy considerando escribir guiones por ahora. :)
cregox
Gracias por devolver mi respuesta a un valor no negativo. Vivo por secuencias de comandos. Soy terrible con BASH, pero me encanta AppleScript y ejecutar comandos de Terminal desde él.
dotHTM