Manter o Mac OSX ativo e sem sono enquanto a tarefa / aplicativo está em execução

10

Quero deixar o rsync funcionando por wifi por horas ligadas na alimentação CA. Mas quando faço isso, o Mac interrompe a conexão após algum tempo.

No painel Configurações de energia, está configurado para "O computador nunca dorme", "Colocar o disco rígido em suspensão quando possível" e "Ativar para acesso à rede".

Além disso, seria bom se o mac realmente dormir quando a tarefa estiver concluída.

Sei que uma pergunta muito semelhante foi feita antes e que existe pmset e insomniaX , mas não quero que a máquina fique sem sono . E não quero continuar instalando mais e mais extensões, nem precisar ajustar o pmset todas as vezes.

Eu quero que ele se comporte nativamente como esperado - fique acordado enquanto eu o deixo executando uma tarefa e depois durmo "quando possível". Desta vez é devido ao rsync, mas da próxima vez pode ser outra coisa.

Estou esperando demais, como de costume? Posso consertar? Está mesmo quebrado?

cregox
fonte

Respostas:

10

Cafeína

Por exemplo:

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

Na página do 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.

Também pode ser usado para situações como "não deixe a tela dormir enquanto estou assistindo este filme":

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

... ou "fique acordado pelos próximos 10.000 segundos":

caffeinate -t 10000

Veja man caffeinatepara detalhes.

Nathan Long
fonte
2
Isso é incrivelmente incrível! Esse padrão é em qualquer OSX? Desde qual versão? (Eu não poderia encontrar rapidamente informações sobre esta)
cregox
@Cawas - de acordo com este artigo, ele começou a ser enviado com o Mountain Lion: cnet.com/news/… eu descobri isso a partir de man pmsetonde a noidleopção está listada como obsoleta.
Nathan Long
Além disso, consulte este bom tutorial: computers.tutsplus.com/tutorials/…
Nathan Long
4

O Jiggler pode ser configurado para "balançar" o mouse apenas quando estiver em execução. Isso impedirá a tela e o computador de dormir. Isso não funcionará em um laptop com a tampa fechada. Para isso, você precisará do InsomniaX ou outro aplicativo baseado em kext.

insira a descrição da imagem aqui

Josh K
fonte
Sem tampa fechada, tudo bem. Eu não quero superaquecer.
Cregox
Aplicação pequena e prática, de fato.
ayaz
Bem, embora eu não precise mais disso, isso realmente resolveu o meu problema e parece uma boa solução. Acho que deveria ter aceitado isso antes.
Cregox 9/03/10
2

Outra alternativa é a cafeína . É um aplicativo - e não uma extensão - que mantém a máquina "ativa" por um período especificado, após o qual a máquina pode fazer o que normalmente faria: ficar em branco, executar o protetor de tela, dormir, etc. Não coloque sua máquina em repouso, mas deixe-a. Parece funcionalmente equivalente a definir as configurações de economia de energia para "nunca" durante o período solicitado e restaurá-las posteriormente.

insira a descrição da imagem aqui

JRobert
fonte
Mas você ainda precisa iniciar e parar o aplicativo. Você não pode configurá-lo e esquecer.
Josh K
1

Você pode considerar criar um Aplicativo Applescript Permanente Aberto que define / redefine o timer de espera com base na existência de um processo em execução. Criar uma lista de inicialização também é uma solução viável, porém ainda estou instável com a sintaxe. O comando "pmset force sleep X" não requer acesso root, mas as configurações são redefinidas na reinicialização.

Como sua situação parece que não poderei prever todas as suas necessidades, esboçarei algo para você.

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 coisas como rsync e processos em segundo plano, você precisará ser mais inteligente e pesquisar outras funções 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

Observe que, no caso acima, procurar apenas "rsync" retornará um falso positivo se o rsyncd estiver em execução porque "rsync" e "rsyncd" correspondem. Você pode ter que ficar mais complicado se isso não funcionar para você.

Se o aplicativo fosse um processo de janela, eu usaria o seguinte para determinar o que está sendo executado:

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

Ou para identificadores de pacote (mais precisos)

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

Conte-me mais sobre o seu cenário e tentarei escrever algo mais exato e com uma interface de usuário mais flexível.

dotHTM
fonte
caramba, vou olhar para tudo o que você disse aqui outra hora, mas obrigado por passar por todo esse problema! No entanto, não estou pensando em escrever scripts por enquanto. :)
cregox 23/02
Obrigado por trazer minha resposta de volta a um valor não negativo. Eu vivo por script. Sou péssimo com o BASH, mas adoro AppleScript e execute comandos de terminal a partir dele.
dotHTM