概要
macOSとiOS間のユニバーサルクリップボード(Handoff)が同期しなくなることがある。MacでコピーしたものがiPhoneにペーストできない、あるいはその逆。以前この問題に遭遇した際、Bluetooth関連のプロセスをkillしたら直った記憶があって、改めて調べたところbluetoothdの再起動が定番の対処法だったので、そのまとめ。
ユニバーサルクリップボードとは
Apple製デバイス間でクリップボードを共有できる機能。同じApple IDでサインインしているMacとiPhoneの間で、片方でコピーしたテキストやURLをもう片方でペーストできる。Handoffの一部として動作していて、BluetoothとWi-Fiを使ってデバイス間の通信を行っている。
これが普通に動いているときは便利なのだが、たまに何の前触れもなく同期が止まる。
まず試すこと: bluetoothdの再起動
最も手軽で効果的なのがこれ。
sudo killall -HUP bluetoothdbluetoothdはmacOSのBluetoothデーモンで、Handoff含むBluetooth通信全般を管理している。-HUPシグナルを送るとgraceful restartになる。プロセスが一旦リセットされて、ユニバーサルクリップボードの接続も再確立される。
これで直らない場合、より強い方法。
sudo pkill -9 bluetoothd-9はSIGKILLで、プロセスを強制終了する。-HUPがgraceful restartを要求するのに対して、-9は問答無用で殺す。bluetoothdはlaunchdが管理しているデーモンなので、killしてもmacOSが自動的に再起動してくれる。なので、killしてしまっても問題ない。
それでも直らない場合
bluetoothdだけで直らないケースでは、関連プロセスも再起動してみる。
sudo killall -HUP sharingdsharingdはHandoffやAirDrop、Continuityといったデバイス間連携機能を管理するデーモン。ユニバーサルクリップボードはHandoffの一部なので、このプロセスが詰まっている可能性もある。
sudo killall -HUP pboardpboardはmacOSのクリップボードブローカー。コピー&ペースト自体を管理するプロセスなので、クリップボード関連の問題にはこれも関係していることがある。
どちらもlaunchd管理のデーモンなので、killしても自動的に再起動される。
プロセス再起動の前に確認すること
プロセスの再起動で直ることが多いが、そもそもの前提条件が満たされていない場合は何をしても動かない。基本的なチェックリストは以下。
- 両方のデバイスが同じApple IDでサインインしているか
- 両方のデバイスが同じWi-Fiネットワークに接続しているか
- 両方のデバイスでBluetoothが有効になっているか
- Handoffが有効か: システム設定 > 一般 > AirDropとHandoff
これらが全部OKで、プロセスの再起動でも直らない場合は、最終手段としてiCloudからサインアウト→再サインインという方法もある。ただしこれはかなり面倒なので、まずはbluetoothdのkillから試すのが良い。
余談
killall -HUPとpkill -9の違いを整理しておくと、-HUP(SIGHUP)はプロセスに「設定を再読み込みして再起動してくれ」と伝えるシグナルで、プロセス側がこれを受けて適切にクリーンアップしてから再起動する。-9(SIGKILL)はOSがプロセスを即座に強制終了するもので、プロセス側でキャッチできない。なので基本は-HUPで試して、それでダメなら-9という順番になる。
ちなみにkillallとpkillの違いは、killallがプロセス名の完全一致で探すのに対して、pkillはパターンマッチで探す。bluetoothdのような明確な名前のプロセスならどちらでもいい。
シェル関数にしておくと楽
毎回3つのコマンドを打つのは面倒なので、.zshrcにまとめて関数にしておくと便利。
fix_clipboard() {
sudo killall -HUP bluetoothd
sudo killall -HUP sharingd
sudo killall -HUP pboard
echo "bluetoothd, sharingd, pboard restarted"
}これを.zshrcに書いておけば、クリップボード同期がおかしくなった時にfix_clipboardと打つだけで3つのデーモンをまとめて再起動できる。sudoのパスワードを聞かれるので入力すればOK。