web-dev-qa-db-ja.com

ふたを閉めた状態でMacBookを指定した時間実行し続ける

場合によっては、MacBookを1時間ほど実行したままにして、1日の終わりに更新や長いデータ分析を完了すると便利なことがあります。不必要な光害を防ぐために、MacBookの蓋を閉めるか、画面をオフにできるようにしたいと思います。

私は以前、MacBookを目覚めさせるために、CaffeineとNoSleepの2つのアプリを使用しました。

  • カフェインを使用すると、MacBookをスリープ状態にしない期間を指定できますが、蓋を閉じるとラップトップがスリープ状態になります。
  • NoSleepを使用すると、ラップトップの蓋を閉じることができます(これにより、画面がオフになり、プロセスが実行されたままになります)が、タイムアウト期間を指定することはできません。

ユーザーがふたを閉じることができる解決策を探していますそしてタイムアウト期間を指定します。ラップトップを一晩中稼働させたままにしたくありません。通常は30分から1時間です。

解決策はありますか?

5
CaptainProg

Githubユーザーのiccirは、Fermataと呼ばれる非常に便利な小さなメニューバーアプリを作成しました。これは、ふたを閉めた状態でMacBookをスリープ状態に保ち、タイムアウト時間を設定できるようにします。

Mojave(10.14.2)で試してみたところ、うまくいきました。 https://github.com/iccir/Fermata

2
Alex Ryan

それは理想的ではありませんが、ここに解決策があります。ふたが閉じていてバッテリーで動作しているときにラップトップがスリープしないようにするには、次のコマンドを実行します。

Sudo pmset -b sleep 0; Sudo pmset -b disablesleep 1

ふたが閉じていてバッテリーで動作しているときにラップトップのスリープを再度有効にするには、次のコマンドを実行します。

Sudo pmset -b sleep 5; Sudo pmset -b disablesleep 0

コマンドの2番目のセットの「5」は、バッテリーを使用しているときにスリープするまでの分数を表します。ラップトップに合わせて必要に応じて調整します。

設定を再度有効にするのを忘れると、バッテリーがオンのときにラップトップがスリープしないため、これは少し危険です。このため、設定を自動的に再度有効にするシェルスクリプトを作成しました。

#!/bin/bash
#***************************************************************************
#*** noz - prevent laptop from sleeping when lid is closed
#***************************************************************************

#***** set some defaults *****
BATTERY_SLEEP=5 # in minutes
DEF_WAKE_LEN=300 # in seconds

#***** determine timeout value *****
timeout_len=${1:-$DEF_WAKE_LEN}

function prevent_sleep() {
    echo
    echo -n "Preventing sleep for $timeout_len seconds; press <enter> to continue..."

    Sudo pmset -b disablesleep 1
    Sudo pmset -b sleep 0
}

function enable_sleep() {
    # $1: <enter> = 0, timeout = 1, Ctrl-C = undef

    #----- insert a newline for timeout or Ctrl-C -----
    if [[ ${1:-1} -eq 1 ]]; then    echo; fi
    echo "Restoring previous battery sleep setting: $BATTERY_SLEEP"

    Sudo pmset -b disablesleep 0
    Sudo pmset -b sleep $BATTERY_SLEEP

    #----- sleep on timeout only -----
    if [[ ${1:--1} -eq 1 ]]; then   Sudo pmset sleepnow; fi
    exit
}

#***** prevent it from sleeping *****
prevent_sleep

#***** trap Ctrl-C *****
trap enable_sleep INT

#***** wait for an enter *****
read -t $timeout_len
rc=$?

#***** re-enable normal sleep *****
enable_sleep $rc

シェルスクリプトは、ヒットするまでスリープを無効にします Enter キー、その時点でスリープ設定を再度有効にします(または、を押すことができます Ctrl-C 同じことを達成します)。また、タイムアウト(デフォルトは300秒/ 5分)が設定され、その後、スリープ設定が自動的に再度有効になり、ラップトップは強制的にスリープ状態になります。会議でラップトップを使用している場合、これは苦痛ですが、家に帰るためにラップトップを忘れてバッグに入れておくと、命の恩人になります。

賢明な読者は、これらのコマンドにはSudoが必要であることに気付くでしょう。悲しいことに、それは避けられないAFAIKです。私が自分のシステムで行ったことは、rootとしてpmsetを実行するためにパスワードを入力する必要がないようにすることです。これを行うには、sudoersファイルを編集します(Sudo visudo)そしてこの行を追加します:

joe ALL=(ALL) NOPASSWD: /usr/bin/pmset

「joe」をユーザー名に置き換えます。シェルスクリプトSETUIDを実行することで、おそらく同じ結果(つまり、パスワードを入力せずにスクリプトを実行する)を達成できますが、私はそれを行うのは好きではありません。 sudoersを介してこの1つのコマンドを開くことは、私にとってリスクが少ないようです。

スクリプトを実行するには、スクリプトをPATHのディレクトリに貼り付けて、次のように呼び出します。

$ noz [<timeout in seconds>]

あなたが行くところに着いたら、単に押す Enter または Ctrl-C そして、あなたは行ってもいいです。そして、それを忘れると、自動的にリセットされてスリープ状態になります。

おそらく、AppleScriptを介してこれらすべてを実現する方法があります。そうすれば、ホットキーを割り当てることができます。コマンドラインからこれを実行するのに飽きたら、それを試してみます。

8
Joe Casadonte

NoSleepは、おそらく、デフォルトのOSXスリープ設定で動作するように設計されています(見つかった ここ 。NoSleepは、蓋を閉じるときにスリープが発生しないようにすることだけを目的としています(少なくとも、これは 方法設計されました )。

この動作が発生していない場合、スリープせずに蓋を閉じることができる唯一の公式な方法は、 外部マウス、キーボード、およびモニターを接続する です。

0
Jonno