この記事では、InternetSharingを自動的にオン/オフする方法について説明します。これにより、手動で安楽死させた場合にMacbookがスリープ状態になったり、ラップトップが再び起動したりするのを防ぎます。
先史時代
私はMacbookで作業していますが、部屋に3Gはありません。 RJ-45を介してラップトップをネットワークに接続する場合、一部の作業はモバイルデバイスに関連付けられているため、InternetSharing(以降ISと呼びます)を使用すると便利です。 ISを設定したら、電話でインターネットの問題を忘れていましたが、仕事を始めるとラップトップの電源が入ります。 初めて重要視しませんでした。 2回目は、彼が電源を入れたときにログを調べることにしました。 私が彼をスリープモードにしたとき、彼は数分後にオンになることが判明しました。
判明したように、ISはアクティブな間、スリープをブロックします。
チーム
pmset -g assertions
ISが有罪であることを示します。
pid 70000:[0x000 ... 000] PreventSystemSleepという名前: "com.apple.InternetSharing"。
私は人々が同様の問題を解決する方法を探し始めましたが、私は「サービスを無効にする」だけに出会いました。
自分で問題を解決しなければなりませんでした。
どうする?
判明したように、構成されたISサービスはファイルの使用を開始および停止します。
/System/Library/LaunchDaemons/com.apple.InternetSharing.plist
解決策はこれであることが判明しました:目を覚ますときにサービスをオンにし、スリープ状態になるときにオフにする、つまり、次のコマンドを使用します。
ただし、これらの操作では、管理者権限を持つユーザーのパスワードを入力する必要があります。
「目覚めたときやスリープ状態になったときにプログラムを実行する方法」を学習すると同時に、パスワードを要求しません。
解決策
最初に、管理者権限で起動される独自のサービスを作成します。つまり、launchctlにパスワードを要求しません。
2番目-目覚めたときとスリープ状態になったとき、それぞれ開始と停止のときにサービスにコマンドを送信します。
そのため、サービスはポート(10001など)でリッスンし、開始および停止コマンドを待ちます。
ISを開始および停止するために、それぞれサービスをPHPで記述します(以下の完全なコード)。次のアクションが実行されます。
実行するには:
shell_exec('launchctl load -F /System/Library/LaunchDaemons/com.apple.InternetSharing.plist');
停止する:
shell_exec('launchctl unload /System/Library/LaunchDaemons/com.apple.InternetSharing.plist');
サービスを開始するには、ファイル
com.username.InternetSharing.plist
をフォルダー
/Library/LaunchDaemons/
に配置する必要があります。
次のコマンドで実行します:
sudo launchctl load -F /Library/LaunchDaemons/com.username.InternetSharing.plist
目覚めと睡眠への移行のイベントをキャッチするために、
Scenario
プログラムを使用します。 AppleScriptで2つのスクリプトを記述し、startまたはstopパラメーターを使用してクライアントプログラム(以下の完全なコード)を呼び出します。
起動スクリプト
do shell script "/usr/bin/php /Users/username/CheckMac/client.php start"
停止スクリプト
do shell script "/usr/bin/php /Users/username/CheckMac/client.php stop"
これらをシナリオプログラムの特別なディレクトリに配置します。
"~/Library/Scenario/Wake Scripts"
"~/Library/Scenario/Sleep Scripts"
"~/Library/Scenario/Wake Scripts"
および
"~/Library/Scenario/Sleep Scripts"
。
結果
オンにすると、シナリオプログラムは「
Wake Scripts
」フォルダーから
Wake Scripts
を起動し、startパラメーターでクライアントプログラムを起動します。 クライアントプログラムは、十分な権限があるため、ISサービスを開始できるサービスに接続します。
スリープモードに切り替えると、同様の操作が実行されますが、「
Sleep Scripts
」フォルダーとstopパラメーターのみが使用されます。
コード
サービス
/Users/username/CheckMac/listen.php com.username.InternetSharing.plist
/ライブラリ/LaunchDaemons/com.username.InternetSharing.plist <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Label</key> <string>com.username.InternetSharing</string> <key>ProgramArguments</key> <array> <string>/usr/bin/php</string> <string>/Users/username/CheckMac/listen.php</string> </array> <key>RunAtLoad</key> <true/> </dict> </plist>
クライアントプログラム
/Users/username/CheckMac/client.php <?php $fp = fsockopen("127.0.0.1", 10001, $errno, $errstr, 30); if (!$fp) { echo "$errstr ($errno)<br />\n"; } else { $out = @$argv[1]."\r\n"; fwrite($fp, $out); fgets($fp, 128); sleep(1);
IS起動スクリプト(テキストファイルではなく、AppleScriptsによって作成されます)
〜/ライブラリ/シナリオ/ウェイクスクリプト/ wake.scptdo shell script "/usr/bin/php /Users/username/CheckMac/client.php start"
OasnovスクリプトIS
〜/ライブラリ/シナリオ/スリープスクリプト/ sleep.scptdo shell script "/usr/bin/php /Users/username/CheckMac/client.php stop"