実行中のプロセスの存在に基づいてスリープタイマーを設定/リセットするStay-Open Applescriptアプリケーションを作成することを検討する場合があります。launchd plistを作成することも実行可能な解決策ですが、構文はまだ不安定です。「pmset force sleep X」コマンドはrootアクセスを必要としませんが、設定は再起動時にリセットされます。
あなたの状況は私があなたのあらゆるニーズを予測することができないように聞こえるので、私はあなたのために何かをスケッチします。
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」の両方が一致するため、rsyncdが実行されている場合、「rsync」だけを検索すると誤検知が返されることに注意してください。これがうまくいかない場合は、さらに注意する必要があるかもしれません。
アプリケーションがウィンドウ化されたプロセスである場合、私は以下を使用して何が実行されているかを判断します。
tell application "System Events" to set RunningAppNames to name of processes
またはバンドル識別子の場合(より正確)
tell application "System Events" to set RunningBundles to bundle identifier of processes
あなたのシナリオについて詳しく教えてください。より正確でより柔軟なユーザーインターフェイスで何かを書こうとします。