FreeBSD初心者運用日記 このページをアンテナに追加

 | 

2009-06-03

[]コマンドを実行して、ほげほげ.soがないと言われたら、、、 04:17 コマンドを実行して、ほげほげ.soがないと言われたら、、、 - FreeBSD初心者運用日記 を含むブックマーク はてなブックマーク - コマンドを実行して、ほげほげ.soがないと言われたら、、、 - FreeBSD初心者運用日記 コマンドを実行して、ほげほげ.soがないと言われたら、、、 - FreeBSD初心者運用日記 のブックマークコメント

方法としては以下の三種類がある。

(1)環境変数?のLD_LIBRARY_PATHにほげほげ.soが存在するディレクトリを追加する
(2)ldconfigで、ELFキャッシュ?にほげほげ.soが存在するディレクトリを追加する
(3)/usr/lib、/usr/local/libに、ほげほげ.soをコピーする。

コンパイルされたプログラムには動的リンカ(※1)の絶対パスと利用するライブラリ名が埋め込まれている。

プログラムが実行されると自身に埋め込まれている動的リンカの絶対パスをもとに動的リンカが読み込まれ、プログラムに埋め込まれているライブラリ名を動的リンカが検索する

動的リンカはライブラリを探すために、まずLD_LIBRARY_PATHで指定されたディレクトリを検索する。

そこになければ、ELFキャッシュ?というところを検索する。

それでもなければ、最後に/usr/lib、/usr/local/libを検索するらしい。

※1 動的リンカ

FreeBSDは、以下がそれにあたるらしい

~$ ls -asl /libexec/ld-elf.so.1
140 -r-xr-xr-x  1 root  wheel  142236 Aug 14  2005 /libexec/ld-elf.so.1

[]メモリの使用率を調査する方法 02:48 メモリの使用率を調査する方法 - FreeBSD初心者運用日記 を含むブックマーク はてなブックマーク - メモリの使用率を調査する方法 - FreeBSD初心者運用日記 メモリの使用率を調査する方法 - FreeBSD初心者運用日記 のブックマークコメント

netstat -mで、currentとmaxを調べる

~$ netstat -m | grep "mbuf clusters"
3254/16832 mbuf clusters in use (current/max)

bcコマンドでパーセンテージを計算

~$ echo "scale=5; 3254 / 16832 * 100" | bc
19.33200

[]実行スクリプトが自分自身のフルパスを取得する方法 02:06 実行スクリプトが自分自身のフルパスを取得する方法 - FreeBSD初心者運用日記 を含むブックマーク はてなブックマーク - 実行スクリプトが自分自身のフルパスを取得する方法 - FreeBSD初心者運用日記 実行スクリプトが自分自身のフルパスを取得する方法 - FreeBSD初心者運用日記 のブックマークコメント

スクリプトを実行した後に、安全のために、実行権限を以下のようにしてはずしていた。

~$ cat hoge.sh
#!/bin/sh
・・・省略・・・
chmod -x $0

しかし、この方法だと問題があることがわかった。

スクリプトを相対パスで実行すると、$0も相対パスになる。(以下、参照)

・サンプルコード

~$ cat hoge.sh
#!/bin/sh
echo $0

・実行結果

~$ ./hoge.sh
./hoge.sh
~$ cd ../
/home$ bsduser/hoge.sh
bsduser/hoge.sh
/home$ /home/bsduser/hoge.sh
/home/bsduser/hoge.sh
/home$

これはつまり、スクリプト途中でディレクトリ移動して、chmod -x $0のとこでfile not foundになる可能性があることを意味する。

スクリプトを実行するときのパスの条件として、以下の3つがある。

(1)絶対パスで指定する。(例: /path/to/file.sh)
(2)相対パスで指定する。(例: ./file.sh)
(3)相対パスで指定する。(例: to/file.sh)

これらを全て考慮した上で、スクリプト自身が自分のフルパスを取得するには以下のようにする。

~$ cat hoge.sh
FILEPATH=$(cd `dirname $0`; pwd)/`basename $0`
 |