LinuxでFirefoxを常駐させる方法

Firefoxの起動時間については多くの人が不満に思っている。とにかく立ち上がりがクソ遅い。初回起動時などキャッシュが効いてない場合は10秒ほどかかる。コンマ数秒で起動するw3mを常用する俺には数秒でも我慢できないくらいだ。

解決策として、予めFirefoxの一部をメモリに常駐させることで起動時間短縮を図れる。windozeの場合、Firefox PreloaderがあるのだがUnix系OSで同等のものは見つからなかった。そこで、俺はFirefoxを終了したらすぐに新しいFirefoxが立ち上がるような形で常駐させている。使い終わったあと再起動するこのやり方だと、Firefox自体がOSのキャッシュに収まっているので数秒で再起動完了である。

ここまでは簡単なスクリプトを書けばいいので楽だが、「Firefoxのウィンドウが作業の邪魔をする」という大問題がある!その都度Firefoxのウィンドウをiconifyなり隠すなりしなければならない。しかも数秒後に起こるので待たされてタチが悪い。計算機のくせに失礼極まりないと怒りたいとこだが、それを解決するのが直前のエントリで紹介したratpoisonのrudenessコマンドだ。Firefox再起動は裏でやれということ。

まずは同じコマンドを永遠に繰り返す1行スクリプトretryを。sleepを入れておかないとなぜかいろいろと問題が起きたので入れておいた。

#!/bin/sh
# File: ~/bin/retry
$@ ;   sleep 0.05; exec $0 $@

次にFirefoxを「裏で」立ち上げるスクリプトDebian GNU/Linuxだと大人の事情で名前がfirefoxではなくてiceweaselとなっているが、適宜読み替えてくれ。

#!/bin/sh
# File: ~/bin/firefox-and-return
. ~/etc/iceweasel-script.conf
ratpoison -c "rudeness 0"
iceweasel& pid=$!
rwait '_.grep(/Iceweasel/).first'
echo $pid | tee $PID_FILE
set_iceweasel_windowid
ratpoison -c "rudeness 15"
# ↓の行はなくてもいい。好みに応じて。
ratpoison -c "number $RP_NUMBER `ratpoison -c 'windows  %n:%t' | grep Iceweasel | cut -d: -f1`" -c "echo Restarted iceweasel"
wait $pid

さて、このスクリプトは説明が必要だ。 ~/etc/iceweasel-script.conf は俺Firefox環境のための共通のものが入っている(後述)。次の5行はひとまとめで考えたほうがいい。

ratpoison -c "rudeness 0"
iceweasel& pid=$!
rwait '_.grep(/Iceweasel/).first'
set_iceweasel_windowid
ratpoison -c "rudeness 15"

rudeness 0で新しいウィンドウを何も表示しないようratpoisonに命令する。そして、Firefoxをバックグラウンドで起動し、pidを得る。それからrwaitでウィンドウが出てくるまで(実際は無視されるので表示しろという命令が出てくるまで)待つ。ウィンドウ(以下略)が出てきたらウィンドウIDを保存し、rudenessをデフォルトに戻す。rwaitで数秒待つだけなのでrudenessは数秒だけ0になる。

そして、子プロセスであるFirefoxの終了を待つ(wait)。

これが設定ファイル。というか関数も入っているんだが…。ファイル名については適当に書き換えてよし。Firefoxはタイトルが開いたページによって変わるし、複数のウィンドウを出せるので、最初のウィンドウのウィンドウIDを保存しておく。そして、xwitでポップアップする。

# -*- sh -*-
# File: ~/etc/iceweasel-script.conf
ICEWEASEL_WID_FILE=/tmp/iceweasel.wid
RP_NUMBER=9
FDUMP_FILE=/tmp/fdump.state
PID_FILE=/tmp/iceweasel.pid

iceweasel_windowid () {
    cat $ICEWEASEL_WID_FILE
}
set_iceweasel_windowid () {
    ratpoison -c 'windows  %t:%i' | grep Iceweasel | cut -d: -f2 > $ICEWEASEL_WID_FILE
}
select_iceweasel () {
    ratpoison -c fdump > $FDUMP_FILE
    xwit -pop -id `iceweasel_windowid`; ratpoison -c only
}

さて、ここまででfirefox-and-returnコマンドが動くようになっているはずだ。実行してみると、裏でFirefoxが動いているのがわかる。

さぁ、後はX Window System起動時に使えるようにしておこう。retryコマンドと組み合わせて、終了直後に復活させる。

retry firefox-and-return &

の1行を ~/.xsession や ~/.xinitrc に加えよう。ratpoisonのコマンドを使っているのでratpoisonよりも後ろの行に置くように。

最後に、常駐させたFirefoxへURLを表示するスクリプトも作ろう。

#!/bin/sh
# File: ~/bin/rp-firefox
. ~/etc/iceweasel-script.conf
firefox -new-tab "$1"; select_iceweasel

rp-firefox http://www.yahoo.co.jp と打つと、Firefoxが全画面表示になって一瞬でYahoo! Japanが表示されているはずだ。Firefoxは起動は遅いが、レンダリングはなかなか速い。バックグラウンドで常駐させておけば、邪魔にならないし、起動時間は関係なくなる。だって、次々とページを見たいとき、いちいち終了させないもんね。

えっ、Firefoxが全画面表示になって、せっかく作った作業用分割状態はどうなるのって?御安心を。:undoすれば元通り♪

一見なんの役に立つのかわからんコマンドがあって、場合によってはとても便利なことがある。ratpoisonはこのへんがGNU Screenっぽい。俺がratpoisonから離れられない理由がまたひとつ増えた。