web-dev-qa-db-ja.com

タスク/アプリの実行中にMacOSXを起動してスリープレスに保つ

AC電源をオンにして何時間もwifi経由でrsyncを動作させておきたい。しかし、そうすると、Macはしばらくして接続を切断します。

[エネルギー設定]ペインでは、[コンピューターをスリープ状態にしない]、[ハードディスクを可能な場合はスリープ状態にする]、[ネットワークアクセスのためにスリープ解除する]に構成されています。

さらに、タスクが完了したら、Macが実際にスリープ状態になると便利です。

私は非常によく似ていることに気づきました 以前に質問がありました そして pmsetinsomniaX がありますが、私はマシンを-にしたくありません 眠れない 。そして、私はますます多くの拡張機能をインストールし続けたくありませんし、毎回pmsetを微調整する必要もありません。

ネイティブで期待どおりに動作するようにします。タスクを実行したままにして、「可能な場合」はスリープ状態にします。今回はrsyncによるものですが、次回は別の可能性があります。

いつものように期待しすぎていませんか?修正できますか?それも壊れていますか?

10
cregox

カフェイン

例えば:

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

マニュアルページから:

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.

また、「この映画を見ている間、ディスプレイをスリープ状態にしない」などの状況にも使用できます。

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

...または「次の10,000秒間起きている」:

caffeinate -t 10000

見る man caffeinate 詳細については。

10
Nathan Long

Jiggler 実行中のマウスのみを「ジグル」するように設定できます。これにより、画面とコンピューターがスリープ状態になるのを防ぎます。これは、ふたを閉めたラップトップでは機能しません。そのためには、InsomniaXまたは別のkextベースのアプリケーションが必要です。

enter image description here

4
Josh K

別の選択肢は カフェイン です。これは、拡張機能ではなくアプリであり、指定された期間、マシンを「アクティブ」に保ちます。その後、マシンは、空白にする、スクリーンセーバーを実行する、スリープするなど、通常どおりに実行できます。つまり、マシンをスリープ状態にしますが、スリープ状態にします。これは、必要な期間、省エネ設定を「なし」に設定し、後で復元することと機能的に同等のようです。

enter image description here

2
JRobert

実行中のプロセスの存在に基づいてスリープタイマーを設定/リセットするStay-OpenApplescriptアプリケーションの作成を検討することもできます。起動されたplistを作成することも実行可能な解決策ですが、構文についてはまだ不安定です。 「pmsetforcesleep 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」の両方が一致するため、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

あなたのシナリオについて詳しく教えてください。より正確で、より柔軟なユーザーインターフェイスを使用して何かを書こうと思います。

1
dotHTM