外部からChromeをリロードする

自分のノートPCに開発用マシンから ssh ではいれるようにするのは嫌だしめんどくさいなーとおもったので、perl でちょろっとかいたら快適にうごいた。

http://d.hatena.ne.jp/tokuhirom/20110304/1299221559

sshではいるのは確かにアレなので、自分もHTTPでコマンドうけつけるdaemon書いてそれ使ってます。ただ、自分のMacにはPlack入ってないのでHTTP::Daemonを使ってます。


MacChromeAppleScriptで制御できる(リロードできる)ってのをid:os0xさんに教えてもらったので、MacならばChromeRepl要らずでできました!

スクリプトエディタで、

tell application "Google Chrome" to reload active tab of window 1

ってアプリケーションを~/bin/reload-chrome.appに作っておいて、リロード指令を発したい他のホストには、

#!/bin/sh
[ $# -eq 1 ] || { echo 'usage: reload-chrome HOST'; exit 1; }
host=$1

ssh $host "~/bin/reload-chrome.app"

シェルスクリプトを用意しておけばOKですネ!


FirefoxにはMozRepl、ChromeにはChromeReplがあるのでそれを使います。

ChromeReplを有効にするには、Chromeに起動時にオプション--remote-shell-port=9222をつける必要があります。

Macの場合、アイコンクリックの起動でオプションを指定する方法がわからなかったので、AppleScript でやりました。

スクリプトエディタ」でこんなん書きます。

do shell script "'/Applications/Google Chrome.app/Contents/MacOS/Google Chrome' --remote-shell-port=9222 &"

で、保存時に、

  • フォーマット: アプリケーション
  • オプション: のチェックは全部外す

とします。chrome.app とか。

あとはchrome.appをDockに登録するとかQuickSilverのカタログのフォルダに放り込むとかして簡単に起動できるようにしとくとグーですね。

このAppleScriptを使った方法だと、Chromeを終了するまでDockにAppleScriptのアイコンも残るのがキモいですが、ぐっとこらえます。アイコン出さない方法あったら教えてください><

ほかにシェルスクリプトChromeを起動する方法もあるんですが、QuickSilverとかからそのスクリプトを実行した場合、ターミナルが立ち上がるのでいやんです。ターミナルおこなさない方法あったら教えてください><

ChromeReplが有効になってるかは、ターミナルで

netstat -an | grep 9222

とかすればいいでしょう。


次にリロード命令を送る方。

ChromeReplは 127.0.0.1:9222 しか listen できないっぽいので、同一ホストの場合はいいんですが、別ホストからは直接 ChromeRepl のポートを叩けません。

いくつか方法はあると思うのですが、めんどいので今回は sshChrome が動いているマシン(Mac)に入って、そのマシンのchrome-replコマンドを実行することにしました。

別ホストでこんなシェルスクリプトをこさえます。

#!/bin/sh
[ $# -eq 1 -o $# -eq 2 ] || { echo 'usage: reload-chrome HOST PORT'; exit 1; }
host=$1
port=${2:-9222}

ssh $host "chrome-repl --port $port -e \"chrome.tabs.getSelected(null, function (t) { chrome.tabs.executeScript(t.id, { code: 'location.reload()' }) });\""

ほんで、

goa[~]$ reload-chrome delhi

とすると、goa(リロード指令を送りたいマシン)からdelhi(Chromeが動いているMac)上のChromeのカレントのタブがリロードできます。

が。。。なんかたまにChromeがハングるにょ。。。