Вы можете подумать о создании приложения Stales-Open Applescript, которое устанавливает / сбрасывает таймер отключения в зависимости от наличия запущенного процесса. Создание launchd plist также является жизнеспособным решением, однако я все еще неуверен в синтаксисе. Команда "pmset force sleep X" не требует корневого доступа, но настройки сбрасываются при перезагрузке.
Поскольку ваша ситуация звучит так, будто я не смогу предугадать все ваши потребности, я напишу для вас кое-что.
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
Обратите внимание, что в вышеприведенном случае поиск только "rsync" вернет ложное срабатывание, если rsyncd работает, потому что "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
Расскажите мне больше о вашем сценарии, и я постараюсь написать что-то более точное и с более гибким пользовательским интерфейсом.