ラベル launchd の投稿を表示しています。 すべての投稿を表示
ラベル launchd の投稿を表示しています。 すべての投稿を表示

2013年3月17日日曜日

Safariの「ページをこのアプリケーションで開く」メニューの項目が多すぎる時

Safariのメニューバーの「開発」メニューを有効にするとその下に、「ページをこのアプリケーションで開く」という項目が見つかります。
これは、現在表示中のページを、同じMac内にインストールしてあるhtmlを開くことができる他のアプリケーションで開くためのものです。例えば、Firefoxなどで開きたい場合に便利です。
私は、Safariで見ると広告が入れ替わったり絵が動いたりして見づらいサイトを、「このページを…」メニューでFirefoxで開くことがあります。
別に広告で収益を得ること自体は構わないのですが、内容に集中できないのも困ります。

以前は、このメニュー項目には他のブラウザ名くらいしか含まれていなかったのですが、気づいたら下のように大量に増えていました。

これでは他のブラウザを開くのに、使いづらくて仕方ありません。
これを見ると問題点がふたつありそうです。
ひとつは、Windowsのアプリケーションがメニュー項目に出現していることです。ParallesでWindows XPをインストールしているのですが、何故かそれが表示されているようです。
もうひとつの問題は、Macのアプリケーションで同じものが2回出現していることです。これは、内蔵ハードディスクから外付けSSDに起動ディスクを引っ越した際に、両方にアプリケーションフォルダがあるためだと思われます。

それぞれ解決していきたいと思います。

1. Windowsアプリケーション項目の削除

Parallelsの設定を変更すると「ページをこのアプリケーションで開く」へのWindowsのアプリケーションの表示がなくなるようです。Parallelsを立ちあげて、「仮想マシン」メニューから「構成...」メニューを選択します。
表示された構成用ウインドウのオプションタブを選択し、アプリケーションボタンをクリックすると以下のような表示になります。

ここで図のように、WindowsアプリケーションをMacと共有するのチェックを外します。
このウインドウを閉じ、Safariを再起動します。すると、以下のように「ページをこのアプリケーションで開く」の項目が大幅に減りました。


2. 元の起動ディスクのアプリケーションフォルダの内容が表示される

単純には、元の起動ディスクのアプリケーションフォルダを削除すればメニューからも消えるのではと思います。試していませんが。
ここでは、元の起動ディスクも残す方法を試します。今使っている起動ディスクが故障した場合など、バックアップとして残しておきたいので。

この辺の情報を管理しているのは、Launch Serviceのデータベースなのでそこを修正すればよさそうです。でも単純にデータベースを修正しても、Spotlight (mds?)が、元の起動ディスクの情報を再インデックスすると意味がありません。そこで、以下の順番で試してみました。

(1) Spotlightの検索対象から元の起動ディスクのアプリケーションフォルダを外す
(2) lsregisterコマンドでLaunch Serviceのデータベースを修復する

以下、順番に説明します。以下の操作の間は念のため、Safariを終了しておきます。

2-1. Spotlightの検索対象から元の起動ディスクのアプリケーションフォルダを外す

システム環境設定を立ちあげ、Spotlightをクリックし、プライバシータブを選びます。ここで、フォルダやディスクをSpotlightの検索から除外できます。

左下の「+」ボタンをクリックして、元の起動ディスクのアプリケーションフォルダを検索対象から除外する場所として追加します。
システム環境設定を閉じて、Spotlightの設定は終了です。

2-2. lsregisterコマンドでLaunch Serviceのデータベースを修復する

この操作は、ターミナルを使います。ターミナルを起動し、lsregisterコマンドのあるディレクトリに移動します。
locateコマンドが使える場合(データベースを作っている場合)は、以下のコマンドでディレクトリの場所を確認します。$がプロンプトで、$の後ろがコマンド、$の次の行が出力です。

$ locate lsregister
/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister
/Volumes/Mini2012 HD/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister

私の場合は、元の起動ディスクの情報もあるので2箇所出力されました。
現在の起動ディスクの方に移動します。
$ cd /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support

コピーペーストが面倒な場合は、次のようにしてもいいかもしれません。
$ cd $(dirname $(locate lsregister | grep ^/System))

locateコマンドが使えない場合は、findコマンドで以下を入力して、場所を確認します。
$ find /System -name lsregister 2>/dev/null

/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister


ディレクトリを移動した後、以下のコマンドでLaunch Serviceのデータベースを再作成します。
$ ./lsregister -lazy 1 -kill -r -domain local -domain user

以前の記事では、
これで終了です。Safariを再起動すると以下のようになりました。

大丈夫のようです。Firefoxがふたつあるのは旧バージョンを残しているためです。
よかった。

2013年1月13日日曜日

.MaxOSX/environment.plistからPATH変数が読まれないことへの対処 [一部修正]

去年(2012年)の前半頃(まだ、Snow Leopardを使っていた頃)のことですが、NerdToolやcrontabから起動しているスクリプトの一部が動かなくなっていることに気づきました。


暫定的な対応


動いているスクリプトと動かないスクリプトを見比べると、スクリプトをフルパスで起動したり、PATH環境変数を再設定しているものは動いていました。PATH変数が何らかの原因で設定されていないようです。とりあえずスクリプト内の動かなかったコマンドが起動できるようにPATH変数を修正して動くようにしていました。
例えばこんな感じです。

修正前
#!/bin/sh
site_check.sh

~/bin ディレクトリにsite_check.shスクリプトを置いていますので、HOME変数を追加します。HOME変数は設定されていました。また、このスクリプト内から/opt/local/binあるコマンドを起動できるようPATHに追加します。

修正後
#!/bin/sh
PATH=/opt/local/bin:$PATH
$HOME/bin/site_check.sh

原因と対応

PATH環境変数が設定されなくなった原因は、Mac OS Xのセキュリティアップデートでの仕様変更のように思われる(どこかで読んだ記憶がある)のですが、ソースを見つけられませんでした。Security Update 2012-002による変更で、ログインした際に、~/.MacOSX/environment.plist内のDYLD_*変数を読み込まないようにしたという記述はあるのですが、PATH変数については記載されていませんでした。[Appleのリンク]

対処については、

  1. アプリケーション内でのInfo.plistでのLSEnvironmentキーを設定する方法
  2. /etc/launchd.confを作成する方法
  3. 個別のアプリケーション毎にlaunchd.plist (ファイル名は別にするようです)を記述する方法

などがあるようです。

1)は、最も安全だそうですですが、アプリケーションのバージョンアップ等で変更を忘れてしまいそうです。また、アプリケーションによっては使えません。2)は、今までログイン時(個別ユーザ用)に設定していたものを、他ユーザにも影響がでるような形で設定するのは、若干抵抗があります。設定自体は、シェルスクリプトの記法に近く楽そうでよいのですね。
3)は、設定がアプリケーション単位で個別にできるのがよい点です。記述は若干面倒そうです。(使い方はLaunchDaemons (launchctl, launchd.plist) の使い方にわかりやすくまとめられていました)

いろいろ考えた末、以下の方針にしました。方針というほど大げさなものでもないのですが。
  1. /etc/launchd.confを使用するが、設定は最小限にする。特に、セキュリティのため、自分のIDの書き込み権がある場所は指定しない。
  2. 個別のアプリケーション内の環境設定等で対応できるものは、そこで対応する。NerdToolのシェルスクリプト等、手間がかからないものも各スクリプトで設定する。
  3. 1.〜2.で対応できない場合、そのアプリケーション用のlaunchd.plistを作成し、ユーザ領域の~/Library/LaunchAgents で管理する。
  4. アプリケーション内のInfo.plistを修正は、バージョンアップ時に修正を忘れたり管理が大変なため行わない。

/etc/launchd.confを設定する前に、現在のlaunchdのPATH設定を調べたところ、以下のようになっていました。
$ sudo launchctl getenv PATH
/usr/bin:/bin:/usr/sbin:/sbin

/etc/launchd.confは存在していないのでこれらは、デフォルトで設定されているのでしょう。また、/etc/pathsは以下のようになっています。

/usr/bin
/bin
/usr/sbin
/sbin
/usr/local/bin

自分のPATH設定に入っている$HOME/bin, /opt/local/bin, /opt/X11/bin, /usr/local/clamXav/binが含まれていませんが、これらはログイン後シェルで使うものが多いので/usr/local/binだけを設定することにしました。それ以外は、.bash_profile等で変更します。

/etc/launchd.confには、

setenv PATH /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

と設定しました。また、/etc/pathsもそれに合わせて/usr/local/binを先頭に持ってきました。

また、crontabやNerdToolなどのシェルは、必要に応じてPATHを追加する方針ですが、現状既にそのように修正しているので基本的にはそのままです。PATHの追加が必要になるのは、ほとんどの場合、$HOME/bin か /opt/local/bin (MacPorts用のパス) です。

感想

environment.plistがサポートされなくなった背景には、Flashbackマルウェアの発生などMac OS Xでもセキュリティを厳しくする必要があるということが挙げられます。Mountain Lionでのsandbox化や承認されたアプリケーションしか基本的にはインストール・起動できないというのもその流れですね。もっと自由にしたいとか、いろいろ意見もあるようですが、今後ますますユーザレベルでも気を付けなければならないのではと思います。

[追記 2013/1/16 ] http://jvn.jp/cert/JVNTA13-010A/ によると、JAVAにまたセキュリティホールが見つかっていますね。注意したいものです。

2012年9月14日金曜日

locateデータベースを作る方法

このアプリケーションで開く その2の記事で、lsregisterコマンドをlocateコマンドで見つけることができると書きましたが、locateコマンドが使えないというか期待通りに動作しない場合があります。locateコマンドが使うデータベースがまだ存在しない場合です。
Snow Leopardの場合ですが、以下のように表示されます。
$ locate lsregister

WARNING: The locate database (/var/db/locate.database) does not exist.
To create the database, run the following command:

  sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.locate.plist

Please be aware that the database can take some time to generate; once
the database has been created, this message will no longer appear.

簡単に訳すると、
locateコマンドが使うデータベース(/var/db/locate.database)がまだないので、sudo launchctl から始まっているコマンドで作ってと言っています。
これをターミナルで実行すればデータベースが作られます。1行で入力する必要があります。結構時間がかかると注意書きがあります。


launchctlコマンドが、直接locateデータベースを作っているのではなく、launchdというデーモンプロセス(システム上に常駐しているプロセス)に、/System/Library/LaunchDaemons/com.apple.locate.plistファイルに従って動作するように教えています。このファイル中で、locateデータベースを作るコマンドや実行するタイミングなどが定義されています。興味のある人は調べるといいと思いますが、データベースは1週間に一度土曜日の午前3:15に更新されるようです。最近インストールしたファイルはすぐ見つからない場合もあるかもしれません。