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.