Ви можете подумати про створення додатка Applecript Stay-Open, який встановлює / скидає таймер сну на основі наявності запущеного процесу. Створення запущеного списку - це також життєздатне рішення, однак я все ще хитну по синтаксису. Команда "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" відповідають. Можливо, вам доведеться стати більш хитрими, якщо це не допоможе вам.
Якщо додаток був процесом Windowed, я б скористався наступним, щоб визначити, що працює:
tell application "System Events" to set RunningAppNames to name of processes
Або для ідентифікаторів групи (точніше)
tell application "System Events" to set RunningBundles to bundle identifier of processes
Розкажіть мені більше про ваш сценарій, і я спробую написати щось більш точне та з більш гнучким інтерфейсом користувача.