2008年12月25日木曜日

プログラムの実行時間の取得

そんなに精度が必要ない場合(秒単位で良い場合)
シェルスクリプト内で,

START=`date +%s`
・・・処理
END=`date +%s`

SS=`expr ${END} - ${START}`

とすれば秒単位での値が入ります.

参考ページ:
シェルスクリプトの処理時間


精度が必要な場合は,
gettimeofdayを使用
使い方は以下のページ参照.
マイクロ秒単位での取得が可能です.

参考ページ:
Manpage of GETOFDAY
C言語:実行時間測定の方法

2008年12月24日水曜日

LD_PRELOAD in シェルスクリプト

随分更新をサボっていました…(*_*;)

この間つまって先輩に助けてもらったことを.

この間の記事で,bashだと,コマンドライン上でプログラムの前にLD_PRELOADの設定ができると記述しました.

これを,シェルスクリプト内に書くと,うまくいきません..

これは,"LD_PRELOAD=./hook.so"をコマンドとして解釈してしまうかららしい.

そこで,こういう場合は,
/bin/bash -c "LD_PRELOAD=./hook.so……"
とすることで解決できました.

2008年12月16日火曜日

メモリ使用量の制限

/boot/grub/grub.conf に追記することで簡単に可能でした.

title Fedora (2.6.25)
root (hd0,0)
kernel /vmlinuz-2.6.25 ro root=/dev/VolGroup00/LogVol00 rhgb quiet mem=1000M
initrd /initrd-2.6.25.img


これでメモリを1000MBに制限したことになります.

reboot してから
% cat /proc/meminfo
で確認できます.

参照ページ:
Linux 関係:grub.conf 起動時のメモリ - livedoor Blog(ブログ)

2008年12月15日月曜日

シェルスクリプト

冒頭に使うシェルを記述し(#!/bin/sh),実行権限を与えることで,
./hoge.shと実行することが可能.

●cnt++;の表現
 cnt=`expr $cnt + 1`
 *イコールの前後にスペースを入れない
 *'(シングルクォート)ではなく`(バッククォート)!!

●argv[1]の表現
 $1

とか色々!

シェルスクリプト3年まで使ったことなかったけど,とても便利ですね★

参照ページ:
シェルスクリプト入門
シェルスクリプト(Bash)

2008年12月13日土曜日

環境変数:LD_PRELOAD

これを用いると,プログラムの変更なしに任意の関数をフックすることができるようです.
……こわい!!笑

環境変数 LD_PRELOAD - 技術メモ帳が分かりやすかったので参考にさせていただきました.

ある関数名を定義し,それを共有オブジェクトとして指定し,プログラムを実行します.
同名関数が存在した場合は上書きすることができるため,関数のフックが可能です.

以下,やり方を.
プログラムhooktest.cを作成し,共有オブジェクトとしてコンパイル.
% gcc -fPIC -shared -o hooktest.so hooktest.c
そして環境変数に指定してメインのプログラムを実行
% LD_PRELOAD=/home/test/hooktest.so ./main
*プログラムを実行する場所と,共有オブジェクトの場所関係を考慮しなくても済ませるため,絶対パスを利用した方がいいカモ

環境変数

自分の現在使用しているシェルの確認
% echo $SHELL

BashとCシェルで色々と違いがあるようです.
●環境変数の設定の仕方
 bashの場合:export (変数名)=(値)
 cshの場合:setenv (変数名) (値)

詳細は,Linux/環境変数の設定へ.

bashでは,あるプログラム実行時のみに環境変数を設定することが可能です
% (変数名)=(値) (実行するプログラム名)

シェルを一時的にbashに変更する場合は,
% bash
とすることで可能で,
% exit
とすることで元に戻れます.

2008年12月12日金曜日

sysstat

システムの状態を監視することができるツール.
rpmで発見したのでいれてみたところ,謎なことにドキュメントしかなくてw
READMEに書いてあったページにいってダウンロードしました.
ここからsysstat-8.1.7.tar.gz
をダウンロード.
以下README通りにやってみたことを.

% tar xvf sysstat-8.1.7.tar.gz
% cd sysstat-8.1.7
% ./configure
% make && make install


インストール完了.
ここで,例えば,プロセスIDが2001のMysqlサーバを5秒ごとに20回値を見たい場合,

% ./pidstat -p 2001 5 20

とすることで,そのプロセスのユーザモード,システムモードでのCPU使用率を監視することができ,平均値まで算出してくれます.

詳細は分かりませんが,ある程度の時間監視したい場合に便利そう.

参照ページ:
sysstatで性能管理(その1)
pidstatでプロセス毎のCPU使用率を測定 | gmt-24.net