クイックツアー
とりあえず使ってみる
ディレクトリ kinoko/local/samples に,いくつかのサンプルスクリプトがあります.まず,CAMAC の ADC をソフトウェアでシミュレートする例を使って,Kinoko を一通り使ってみます.
SmallKinoko
SmallKinoko は,リアルタイムのデータ表示などができる,マルチプロセスのデータ収集システムです.ただし,単一の PC 上で動作し,ネットワーク上の分散並列処理などはできません.
使い方
- ディレクトリ samples に移り,SmallKinoko を立ち上げてください.
% cd kinoko/local/samples
% smallkinoko
- しばらくするとコントロールパネル,ロガーとビューアの3つのウィンドウが表示されます.それぞれ,タイトルに SmallKinoko Control Panel,logger および viewer と表示されています.コントロールパネルには,読み出しスクリプト名,描画スクリプト名およびデータファイル名を指定するフィールドがあります.それぞれ以下の値を設定し,下部にある [Construct] ボタンをクリックしてください.
- ロガーウィンドウには,各コンポーネントからのログメッセージが表示されます.ここにエラーなどが無ければ,コントロールパネルの [Start] ボタンをクリックしてください.データ収集を開始します.
- ビューアウィンドウには,ヒストグラムなどの絵が描画され,毎秒更新されていきます.View Script に CamacAdc-Fancy.kvs を指定した場合は,上部にタブが表示され,複数のページを選択できます.ヒストグラムなどはマウスで範囲を選択すると表示を拡大できます.右クリックでメニューが表示されます.
- [Stop] ボタンでデータ収集を終了します(コントロールパネルから自動終了条件を設定することもできます).データ収集が完了したら,[Quit] ボタンでプログラムを終了してください.
- データファイルは,SmallKinoko を立ち上げたディレクトリに作成されます.kdftable プログラムでその中身を見ることができます.
% kdftable testrun.kdf
# Creator: KinokoRecorderCom
# DateTime: 2008-05-28 13:18:54 JST
# UserName: sanshiro
# Host: kinoko.awa.tohoku.ac.jp
# Directory: /home/sanshiro/work/kinoko/local/samples
# RunName:
# Comment:
# DataSource: CamacAdc
# Fields: index time adc.0 adc.1 adc.2 adc.3
# FieldTypes: int int float float float float
# StartTime: 1279144524
0 0 1730 1675 1059 122
1 0 1199 1743 2299 213
2 0 1457 564 1100 1554
3 0 1847 1158 1161 378
4 0 1881 1068 1506 1095
TinyKinoko
TinyKinoko は,データ収集部分のみの機能をもったシングルプロセスのプログラムです.SmallKinoko と同じスクリプトで動作し,同じ形式のファイルを生成します.
TinyKinoko の実行は,以下のように読み出しスクリプトのファイル名とデータファイル名,およびオプションで収集するイベント数を指定するだけです.描画などは行わないので,描画スクリプトは指定しません.
% tinykinoko SimCamacAdc.kts testrun.kdf 100
実行中に Ctrl-c (コントロールキーを押しながら c) で終了させることもできます.
準備
実際にデータを取り始める前に,作業ディレクトリを作成してください.ここには,Kinoko で使用されるスクリプトファイルや Kinoko が生成するデータファイル,ログファイルなどが配置されます.
Kinoko は,明示的に指定された場合(特に Web-KiNOKO の場合)を除いて,実行時に生成するファイルは全てここに配置します.
作業ディレクトリは読み書き可能であればどこでも良いのですが,この例では,ホームディレクトリディレクトリの下に,daq というディレクトリを作成し,その下で作業することにします.
% cd ~
% mkdir daq
% cd daq
なお,クイックツアーで使用しているスクリプト類は全て kinoko/local/tutorials/QuickTour に置いてあるので,ここからコピーして使用できます.
% cp $KINOKO_ROOT/local/tutorials/QuickTour/* .
TinyKinoko を使う
TinyKinoko は,シングルプロセスで動作するテキストベースのデータ収集プログラムです.リアルタイムのデータ表示などはできませんが,読み出しスクリプト(.ktsスクリプト)に基づくデータ読み出しなどはできます.この部分は他の kinoko と共通なので,特に初期の動作テスト等に役に立ちます.
ここでは,東陽テクニカの CAMAC コントローラ (CC/7x00) を使った CAMAC システムに,林栄精器の電荷積分型 ADC (RPC-022) を使い,チャンネル 0 からチャンネル 3 のデータを読み出してみます.なお,ADC はステーション 3 に入っており,ゲート入力後 LAM を発生するように設定されているとします.
以下のようなファイルを書き,Trial01.kts という名前で保存してください(行番号は後の説明のためのものです.これは入力しないでください).
1: /* Trial01.kts */
2:
3: datasource CamacAdc
4: {
5: int station_number = 3;
6: long readout_channels = #0..#3;
7:
8: CamacCrate crate;
9: CamacController controller("Toyo-CC7x00");
10: CamacModule adc("Rinei-RPC022");
11:
12: crate.installController(controller);
13: crate.installModule(adc, station_number);
14:
15: on trigger(adc) {
16: adc.read(readout_channels);
17: adc.clear();
18: }
19: }
若干の文法拡張がしてありますが,基本的な部分は C++ と同じなので,理解しやすいと思います.詳しくは,使用方法の章で説明します.
ユーティリティ ktscheck により,スクリプトの構文エラーをチェックできます.
% ktscheck Trial01.kts
UNIX の伝統に従い,エラーがない場合には何も出力されません.エラーがあれば,行番号とともにメッセージが表示されます(以下の例では,Rinei-RPC022 を Rinei-RPC002 としてしまっている).
% ktscheck Trial01.kts
script exception: line 10: unknown camac module: Rinei-RPC002
%
エラーがないことを確認したら,このスクリプトを指定して,TinyKinoko でデータを読み出してみます.
% tinykinoko Trial01.kts trial01.kdf 100
ここで,第2引数はデータファイル名,第3引数は読み出すイベント数です.イベント数を省略したら,Ctrl-cを押すまで実行を続けます.また,--time オプションにより,秒数を指定して実行することもできます.プログラムを実行する前に,ADC のゲートにちゃんと信号が入るようにしておいてください(適当な信号源がない場合は,10〜100Hz 程度のクロックをゲートに入れるだけでも良いです).
もし,すでに同名のデータファイルが存在している場合,tinykinoko はエラーを出して停止します.その場合は古いデータファイルを削除するか,強制上書きオプション -f を指定してください.
うまく動作したでしょうか.ちゃんと終了すれば,trial01.kdf というファイルができているはずです.script exception というエラーが出た場合は,スクリプトの文法エラーです.上の例とよく見比べて,修正してください.メッセージが出ずに固まってしまった場合は,以下の点を確認してください.
- ゲートにちゃんと信号が来ているか.ゲート信号幅は適切か.
- ADC は LAM を出すように設定されているか(RPC-022 はジャンパ設定が必要です).
- CAMAC コントローラは LAM を受け取ったとき割り込みを発生させるようになっているか(CC/7000 ではジャンパ設定が必要です).
- デバイスドライバはちゃんと動作しているか(ドライバのテストプログラムで確認してください).
- モジュールが故障していないか(トラブルの原因の大半はこれです).
データファイルを読む
得られたデータ (trial01.kdf) は様々な情報を含んだバイナリファイルです.これをテキストに直す一番簡単な方法は,以下のように kdfdump ユーティリティを使うことです.
% kdfdump trial01.kdf -
これにより以下のような出力が得られるはずです.
# Creator: tinykinoko
# DateTime: 2008-05-28 13:18:54 JST
# UserName: sanshiro
# Host: kinoko.awa.tohoku.ac.jp
# Directory: /home/sanshiro/work/kinoko/local/trial01
# ScriptFile: Trial01.kts
# EventTime: 1211948334
# EventTime: 1211948334
adc 0 1970
adc 1 1043
adc 2 1505
adc 3 339
# EventTime: 1211948334
adc 0 1216
adc 1 1411
adc 2 972
adc 3 183
adc 0 1521
adc 1 1510
adc 2 885
adc 3 1369
# EventTime: 1211948335
adc 0 173
adc 1 2022
adc 2 1016
adc 3 704
(以下省略)
# から始まる行はコメントです.データは,左のカラムから,セクション名,アドレス,データです.この例の場合,セクション名はスクリプト中でモジュールにつけた名前(スクリプト10行目),アドレスはADCのチャンネルです.イベントの区切りに空行が挿入されています.また,# EventTime には,時刻情報が UNIX の time(2) 形式で1秒ごとに記録されています.
データの形式が単純な場合は,ユーティリティ kdftable を使ってもう少し扱いやすい形に整形できます.kdftable が利用できるのは,各イベントのデータの構造が表形式で表現できる形で固定されている場合です.フラッシュADCやマルチヒットTDCなどのデータには使用できません.
% kdftable trial01.kdf -
# Creator: tinykinoko
# DateTime: 2008-05-28 13:18:54 JST
# UserName: sanshiro
# Host: kinoko.awa.tohoku.ac.jp
# Directory: /home/sanshiro/work/kinoko/local/trial01
# ScriptFile: Trial01.kts
# Fields: index time adc.0 adc.1 adc.2 adc.3
# StartTime: 1211948334
0 0 1970 1043 1505 339
1 0 1216 1411 972 183
2 1 1521 1510 885 1369
3 1 173 2022 1016 704
4 2 1632 1518 1075 1951
(以下省略)
ここで,最初のカラムはイベント番号,2番めは開始時刻からの経過秒数です.ヘッダの StartTime フィールドには開始時刻が UNIX の time(2) 形式で書かれています.
コメントや空行は解析プログラムの中で簡単に読み飛ばせると思いますが,もし邪魔なら,UNIX 標準のコマンド grep で取り除くことができます.
% kdftable trial01.kdf | grep "^[0-9]"
0 0 1970 1043 1505 339
1 0 1216 1411 972 183
2 1 1521 1510 885 1369
3 1 173 2022 1016 704
4 2 1632 1518 1075 1951
(以下省略)
また,ユーティリティ knt2root により,kdftable の出力を ROOT の TTree に変換できます.
% kdftable trial01.kdf > trial01.knt
% knt2root trial01.knt
% kdftable trial01.kdf | knt2root - trial01.root
% root trial01.root
root [1] _file0->ls();
TFile** trial01.root
TFile* trial01.root
KEY: TTree CamacAdc;1 CamacAdc
KEY: TTree CamacAdc_PropertyList;1 CamacAdc_PropertyList
root [2] TTree* CamacAdc = _file0->Get("CamacAdc");
root [3] CamacAdc->Show(0);
======> EVENT:0
index = 0
time = 0
adc.0 = 1970
adc.1 = 1043
adc.2 = 1505
adc.3 = 339
ここで,knt2root の第1パラメータは入力ファイル名,第2パラメータは出力ファイル名で,入力ファイル名に - を指定すると標準入力から読み込むようになります.出力ファイル名を省略すると,入力ファイル名の拡張子を .root にしたものが生成されます.入力が標準入力で出力ファイル名が省略されていると,noname.root というファイルが生成されます.
プログラムの中から直接 KDF ファイルを読む方法については,使用方法の章で説明します.
TinyKinoko グラフィカルフロントエンド
TinyKinoko 用のグラフィカルフロントエンド tinykinoko-graphical を使うと,tinykinoko を使ったデータ収集を GUI 上で行うことができます.さらに,tinykinoko-graphical は Kinoko の描画システムや ROOT と連動し,得られたデータのヒストグラムなどを表示することもできます.この際,これらの描画ツールでデータファイルを読み,解析するためのスクリプトを自動生成するので,これを雛型にして描画スクリプトや解析スクリプトを作成すると便利です(ハードコーディングが多いですが...).
注意
TinyKinoko-Graphical では,xterm のウィンドウを開いてその中でいくつかの子プロセスを実行します.そのために xterm がインストールされている必要があります.また,一部のシステムでは,xterm 中での tinykinoko 実行がうまく動作しないことがあるようです.原因については調査中ですが,その場合はとりあえず深入りをせずに,次の SmallKinoko に進んでください.
TinyKinoko-Graphical は,シェルからオプション等を指定せずに立ち上げます.デスクトップ上にアイコン等を作成するのに適した形式です.
% tinykinoko-graphical
データ収集に必要なスクリプト名などのパラメータはウィンドウ上の Configuration および Run Control セクションに指定します.ここに設定した内容は次回以降も保存されます.
データ収集を開始するには,Run Control セクションの [Start] ボタンを押してください.端末ウィンドウ(xterm など)が開き,その中で tinykinoko が実行されます.このウィンドウで Ctrl-c を押すことにより,データ収集を停止させることができます.
得られたデータは,Data Dump セクションの [Dump] ボタンで表示することができます.また,[Summary] ボタンで,チャンネルごとのイベント数や平均などの統計情報を表示できます.
Plot セクションのフィールドにパラメータを設定し,[Generate Script] ボタンを押すと,描画スクリプトを自動生成します.同じセクションの [Draw] ボタンにより,描画ツールを起動して,そのスクリプトを実行します.描画ツールの選択は,Plot セクションの Visualizer フィールドで指定します.
ROOT へのインターフェース部分には,内部で kdftable ユーティリティを使用しています.したがって,これらの機能が使えるのは,得られたデータが kdftable で扱える場合のみです.Kinoko の描画システムである KinokoViewer を選択した場合は,kdf ファイルが直接読み込まれるので,この制限はありません.
SmallKinoko を使う
SmallKinoko は,単一のPC上で動作する(ネットワーク機能を持たない)マルチプロセスのデータ収集システムです.データを読み出す Collector,共有メモリを管理する Buffer,リアルタイムにデータを表示する Viewer,データを記録する Recorder,ログを記録する Logger,およびユーザコントロールを伝達する Controller の各コンポーネントから構成されます.
このうち Controller,Logger,Viewer はユーザインターフェース(KinokoShell)との通信チャネルを持ち,それぞれ kinoko-control,kinoko-board,kinoko-canvas の各ウィンドウと接続されます.
使用する前に,Viewer コンポーネントが使用するスクリプト(ビュースクリプト)を作成します.
以下のようなファイルを書き,Trial01.kvs という名前で保存してください(拡張子は .kvs です..kts などと混乱しないように注意してください).また,Tinykinoko Graphical で KinokoViewer を指定して雛型を作成することもできます.
1: /* Trial01.kvs */
2:
3: display CamacAdc
4: {
5: Histogram histogram_adc_01("ADC ch 01", 128, 0, 4096);
6: Histogram histogram_adc_all("ADC all channels", 128, 0, 4096);
7: Tabular tabular_adc_all("ADC values");
8: Trend trend_event_rate("Event Rate", 0, 5000, 60);
9:
10: analysis {
11: DataElement adc_01("adc", 1);
12: DataElement adc_all("adc");
13:
14: histogram_adc_01.fill(adc_01);
15: histogram_adc_all.fillOne(adc_all);
16: tabular_adc_all.fillOne(adc_all);
17: trend_event_rate.fill(adc_01);
18: }
19:
20: on every (1sec) {
21: histogram_adc_01.draw();
22: histogram_adc_all.draw();
23: tabular_adc_all.draw();
24: trend_event_rate.drawCounts();
25: }
26: }
このスクリプトも,だいたい想像したとおりに動きます.詳細については,使用方法の章で説明します.
ビュースクリプトに対するスクリプトチェックのユーティリティは kvscheck です.ktscheck と同様に,エラーがなければ何も表示されません.
% kvscheck Trial01.kvs
読み出しスクリプトもあらかじめ tinykinoko でチェックしておきます.
% tinykinoko -f Trial01.kts trial01.kdf
tinykinoko で取ったデータを使って,kinoko-viewer ツールで描画内容をチェックします.
% kinoko-viewer trial01.kdf Trial01.kvs | kinoko-canvas
スクリプトの準備ができたら,smallkinoko を起動します.
% smallkinoko
しばらくすると,いくつかのウィンドウが表示されます.ウィンドウのタイトルバーには,それぞれ,[SmallKinoko Control Panel],[logger],[viewer] とかかれているはずです.これらが,それぞれ Controller,Logger,Viewer の各コンポーネントと接続された KinokoShell のウィンドウです.
コントロールパネルウィンドウの各フィールドに,以下の値を設定してください.
Readout Script (.kts): Trial01.kts
View Script (.kvs): Trial01.kvs
Data File (.kdf): trial01.kdf
できたら,コントロールパネルの [Construct] ボタンを押してください.各コンポーネントがスクリプトの解読をし,データストリームを構築していきます.コンポーネントが出すログメッセージは,ロガーウィンドウに表示されます.以下は,ロガーに表示されるメッセージの例です.
N 05 Mar 2001 06:35:13 JST, collector: change state: ComponentReady
N 05 Mar 2001 06:35:14 JST, recorder: change state: ComponentReady
N 05 Mar 2001 06:35:14 JST, viewer: change state: ComponentReady
N 05 Mar 2001 06:35:14 JST, buffer: change state: Constructing
N 05 Mar 2001 06:35:15 JST, buffer: change state: DataTaking
D 05 Mar 2001 06:39:16 JST, collector: setReadoutScript(): trial01.kts
D 05 Mar 2001 06:39:16 JST, viewer: setViewScript(): trial01.kvs
D 05 Mar 2001 06:39:16 JST, recorder: setDataFile(): smallkinoko.kdf
D 05 Mar 2001 06:39:17 JST, collector: setSink: buffer (buffer) @127.0.0.1, shm: 100, msg: 101
D 05 Mar 2001 06:39:18 JST, recorder: setSource(): buffer (buffer) @127.0.0.1, shm: 100, msg: 101
D 05 Mar 2001 06:39:19 JST, viewer: setSource(): buffer (buffer) @127.0.0.1, shm: 100, msg: 101
N 05 Mar 2001 06:39:19 JST, collector: change state: Connecting
D 05 Mar 2001 06:39:19 JST, collector: connecting sink...
D 05 Mar 2001 06:39:20 JST, collector: connected
(以下省略)
各ログメッセージの最初の文字がログレベルを表しています.ログレベルの意味は以下のとおりです.
もし,エラー (E または P) が表示された場合,[Quit] ボタンを押してシステムを終了させてください.ほとんどの場合,スクリプトのエラーが原因です.
ここまで正常に来たら,[start] ボタンを押してデータ収集開始です.一秒ごとにヒストグラムが更新され,伸びていくのが見られます.
あきたら [Stop] ボタンを押してデータ収集を止め,次に [Quit] を押して終了してください.[Stop] の後に別のスクリプトやデータファイルを指定してもう一度 [Construct] し [Start] することもできます.
SmallKinoko を活用する
SmallKinoko のコントロールパネルには,コメントを記入したりデータファイルに関するオプションを設定するなどの様々なフィールドがあります.
コントロールパネルに記述された RunName や Comment の内容は,[Construct] をした際に,そのままデータファイルのヘッダに記録されます.ヘッダの内容は,kdfdump などで表示させることができます.
[Auto-stop Conditions] にある #-of-events や time を設定すると,指定した数のイベントを処理した時や指定した時間が経過した時に自動でランを停止させることができます.この機能を使用しない場合は,これらのフィールドを空欄のままにしておいてください.
データファイルを指定するフィールドのとなりにある [substitute] ボタンを押すと,データファイル名に含まれる特殊文字を置換できます.何度もデータを取る場合,いちいちデータファイル名を変えなくて済むので便利です.
- "#数字" があると,数字の部分をインクリメントします.# だけで数字がなければ,# が #1 になります.
run-#.kdf --> run-#1.kdf
run-#0100.kdf --> run-#0101.kdf
- "$d数字" があると,数字を削除して,$d を $d日付 に置き換えます.
run-$d.kdf --> run-$d051207.kdf (2005年12月7日)
run-$d051206.kdf --> run-$d051207.kdf
- "$t数字" があると,数字を削除して,$t を $t時間 に置き換えます.
run-$t.kdf --> run-$t092311.kdf (9時23分11秒)
run-$t092311.kdf --> run-$t092543.kdf
なお,いろいろな条件で取った kdf ファイルがたくさんある場合は,kdflist コマンドでそれらを一覧できます.
% kdflist run-*.kdf
run-#1.kdf sanshiro 18528 2005-12-07 23:35:55 JST physics run #1
run-#2.kdf sanshiro 9788 2005-12-07 23:36:23 JST pedestal run #1
run-#3.kdf sanshiro 18712 2005-12-07 23:36:50 JST physics run #2
run-#4.kdf sanshiro 9880 2005-12-07 23:37:19 JST pedestal run #2
[Data File Settings] にある Enable File Name Auto-Substitution を選択すると,このファイル名前置換を [Construct] のときに自動で行うようになります.
Prohibit Datafile Overwriting は,データファイルの上書きを禁止するオプションです.通常,すでに存在するデータファイル名を指定すると,警告のポップアップがでますが,このオプションが設定されていると,ポップアップで上書きを選択しても,エラーになって上書きができないようになります.
Set Datafile Readonly を選択すると,取ったデータのデータファイルの属性を書き込み不可に設定します(444: -r--r--r-- にする).Kinoko はファイルの属性を一切変更しないので,ファイルはシステムレベルで保護されることになります.
Enable Data Compression を選択すると,zlib を用いたファイル圧縮が行なわれます.ファイルはかなり小さくなりますが,ファイルのランダムアクセスなどの一部の機能が使えなくなる場合があります.
Make Data Index を選択すると,インデクスファイルが別に生成され,これを用いたランダムアクセスができるようになります.ただ,通常は指定する必要はないと思います(インデクスは後から生成させることもできます).
これらのオプションは [Construct] ボタンをクリックする前に設定されている必要があります.
Web-KiNOKO を使う
Web-KiNOKO を使うと,実行中の Kinoko をウェブブラウザからコントロールしたり,ビューアの絵やロガーのメッセージをリアルタイムに確認したりできるようになります.また,生成されたウェブページを保存しておくことにより,後からデータ収集の記録として利用できます.
Web-KiNOKO は,比較的新しめの標準的なウェブブラウザで動作します.Firefox 3.5,Safari 3.0,Chrome 5.0 beta および Opera 9.51 で動作確認を行いました.Internet Explorer では動作しません.また,ブラウザでは,JavaScript が利用可能に設定されている必要があります.
Web-KiNOKO では,それ自体としてはアクセス制限の機能を提供していません.必要に応じて,ウェブサーバの認証機能などを設定してください.
現時点では,Web-KiNOKO のセキュリティが十分でない可能性があります.ファイアーウォールの内側だけで使用するか,慎重なアクセス制限を設定した状態で使用してください.
Web-KiNOKO を使用するには,ウェブサーバ (Apache など) を動作させて,そこから参照できるディレクトリを用意する必要があります.この例では,/home/kinoko/public_html/webkinoko が Web-KiNOKO 用に設定されているディレクトリだとします.このディレクトリで .cgi ファイルの CGI が実行できるようにしておいてください.
kinoko/scripts に dump-http-request.cgi というサンプル CGI があるので,これを Web-KiNOKO のディレクトリに置き,ウェブブラウザから http://...../~kinoko/webkinoko/dump-http-request.cgi にアクセスすることにより,CGI の設定ができているか確認できます.Not Found となる場合はおそらくウェブサーバのホームディレクトリもしくはユーザディレクトリの設定が正しくありません(Apache なら httpd.conf ファイルの UserDir public_html など).ファイルの中身が表示されてしまう場合は CGI が正しく設定されていません(Apache なら AddHander cgi-script .cgi).Forbidden となる場合は,ファイルやディレクトリのパーミッションが正しくないか(ディレクトリの実行許可が必要),CGI 実行許可オプションが設定されていません(Apache なら Options ExecCGI など).
上記の設定がされていれば,SmallKinoko のスタート時に --web-root オプションで Web-KiNOKO 用のディレクトリを指定するだけで Web-KiNOKO を使用できるようになります.SmallKinoko は指定されたディレクトリの下に run-日付 という名前のディレクトリを新規に作成し,そこに必要なファイル類を自動でコピーします.
% smallkinoko --web-root=/home/kinoko/public_html/webkinoko
環境変数 KINOKO_WEB_ROOT を指定しておくと,毎回 --web-root を指定しなくても Web-KiNOKO の設定が自動で行われます.ただし,この場合は SmallKinoko を実行するたびに全てのファイルが保存され続けてしまうので,ファイルの管理に注意が必要です.
--web-root を設定して SmallKinoko を立ち上げたら,そのディレクトリをウェブブラウザでアクセスしてみてください.run-日付-時間 というディレクトリができているので,そこをクリックします.Web-KiNOKO のページの上部には,以下のようなメニューがあります.
一番左側のプルダウンメニューでは,動作モードを設定します.static モードでは,ページのロード時にのみ更新を行い,その後の自動更新は行いません.逆に live モードでは,コントロールパネルの値,ビューアの絵,ロガーのメッセージ,モニタの数値などが適宜更新されていきます.実行中の Kinoko に対しては live モードが,過去のランに対しては static モードが適しています.実行中の場合でも,自動更新が邪魔な場合は static モードにすることにより更新を止めることができます.Safari および Chrome では,今のところロガーの自動更新が動作しないので,ロガーだけは static モードを使用してください.
モード選択の右側には,ページ選択メニューがあり,それぞれコントロールパネルやビューアなどを選べます.モードを変更した場合は,もう一度ページ選択ボタンでページを選択しなおし,モード変更を反映させてください.
ネットワークの状態によっては,コントロールパネルからの操作に時間がかかることがあります.このときボタンを複数回クリックするとエラーメッセージなどが出てうっとおしいことになるので,コントロールパネルのボタンを操作したら,次の更新が終わるまで(通常1秒程度)はボタンなどを操作しないようにしてください.また,SmallKinoko 本体がポップアップウィンドウを表示してユーザの操作待ちになった場合,Web-KiNOKO の操作もできなくなってしまうので注意してください(Web-KiNOKO ではポップアップは表示されません).
一番右側にある Run Summary は,ランの実行時間やコメント,使用したスクリプトなどをまとめて表示します.このページに関しては,実行中はあまり意味をもちません.実行後に過去のランの条件を参照するのに便利です.
右上の茶色の KiNOKO の文字をクリックするとラン一覧のページに戻ります.ウェブサーバで PHP が利用可能なら,kinoko/scripts にある index.php ファイルを --web-root で指定したディレクトリへコピーしておくと一覧表示がまともになります.
データ収集プロセスを別コンピュータに配置する
SmallKinoko の起動時に --daqhost オプションを指定すると,データ収集プロセスのみを別のコンピュータ上で実行させることができます.これにより,Kinoko 本体を大容量ディスクのあるコンピュータで実行しながら実験室の PC でデータをとるようにしたり,CC/NET にデータ収集プロセスだけを走らせて他のコンピュータで表示や記録を行ったりなどができるようになります.
% smallkinoko --daqhost=ccnet.u-kinoko.ac.jp
[注意]
この機能を使用するためには,--daqhost で指定されるコンピュータ上にも同じバージョンの Kinoko がインストールされ,そのコンピュータへパスワードなしで ssh できるように設定されている必要があります.ssh-agent を利用するか,安全が確保できるなら,空のパスフレーズ(パスワードではない)を設定するかしてください.
ssh 等でリモートのコマンドを直接実行する場合,ログインスクリプトの書き方によっては KiNOKO の環境設定の部分が実行されないことがあります.例えば,Ubuntu や CCNET などの Debian 系では,デフォルトの .bashrc の先頭部分に以下のような記述があります.
# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples
# If not running interactively, don't do anything
[ -z "$PS1" ] && return
...
このような場合は,「インストール」で設定した KiNOKO の環境変数の記述をこの行よりも前に配置するようにしてください.
ここまでの設定ができていれば,以下のように ssh を使ってリモートの KiNOKO のコードが実行できるようになっているはずです.
% ssh -l toyo ccnet.u-kinoko.ac.jp kinoko-config
二つのコンピュータ間で Kinoko のインストールディレクトリが異なる場合,(Mac と Linux など),KCOM_PATH 環境変数には,双方のコンピュータでの KCOM_PATH の値をコロン区切りで両方指定してください.
export KCOM_PATH=".:/home/daq/kinoko/bin:/Users/daq/kinoko/bin"
setenv KCOM_PATH ".:/home/daq/kinoko/bin:/Users/daq/kinoko/bin"
コンピュータ間でユーザ名が異なる場合は,--daqhost で指定するホスト名の前に「ユーザ名@」をつけてください.
% smallkinoko --daqhost=toyo@ccnet.u-kinoko.ac.jp
[注意]
データ収集プロセス(Collector コンポーネント)は --daqhost で指定されるコンピュータ上で動作するので,読み出しスクリプトもそのコンピュータ上のものが読み込まれます.混乱しないように十分注意してください.SmallKinoko コントロールパネル上の [Copy script files to remote DAQ hosts] のチェックボックスをチェックすると,[Construct] したときに手元のスクリプトが自動でコピーされ,それが使用されるようになります(ファイルの上書きに注意してください).この機能は CCNET など普段はログインしないコンピュータを使用するときに便利です.
[注意]
--daqhost のコンピュータにおいて,Kinoko は起動されたコンピュータと同じディレクトリに移動することを試みます.ディレクトリ構造やユーザ名が異なっていてこれができない場合,Kinoko はホームディレクトリで動作します.読み出しスクリプトは,絶対パスで指定されていない限り,この動作ディレクトリから検索されることに注意してください.自動コピーする場合のコピー先もこの作業ディレクトリになります.--daqhost オプションの末尾にコロンで区切って動作ディレクトリを指定することができます.
% smallkinoko --daqhost=toyo@ccnet.u-kinoko.ac.jp:/home/toyo/work
[注意]
複数のコンピュータを使う状況でエラーが起こると面倒なことになるので,あらかじめ --daqhost のコンピュータ上で tinykinoko を使ってスクリプトとハードウェアのテストをしてから SmallKinoko を使ってください.
例:Mac OS X から CC/NET を使う
この例では,CC/NET のホスト名は "ccnet.u-kinoko.ac.jp" で,CC/NET には "toyo" アカウントの "/home/toyo/kinoko" に Kinoko がインストールされているとします.Mac 側は "daq" アカウントの "/Users/daq/kinoko" に Kinoko がインストールされているとします.Mac 側にある "MyCamac.kts" を使ってデータをとることにします.
- 準備:CC/NET の /home/toyo/kinoko に Kinoko をインストールする
- 準備:CC/NET の /home/toyo/.ssh/authorized_keys に Mac 側 daq アカウントの SSH キーを登録する
- 準備:CC/NET 側の .bashrc の KiNOKO 環境設定をリモートから実行される位置に移動する(上記参照)
- 準備:Mac 側で .bashrc または .cshrc の KCOM_PATH を設定し,ウィンドウを閉じる
export KCOM_PATH=".:/Users/daq/kinoko/bin:/home/toyo/kinoko/bin"
setenv KCOM_PATH ".:/Users/daq/kinoko/bin:/home/toyo/kinoko/bin"
- 準備:Mac から CC/NET に ssh で入って tinykinoko で動作を確認する
% scp MyCamac.kts toyo@ccnet.u-kinoko.ac.jp:
% ssh toyo@ccnet.u-kinoko.ac.jp
% tinykinoko MyCamac.kts
% rm MyCamac.kts
% exit
- Mac 側で SmallKinoko を立ち上げる
% smallkinoko --daqhost=toyo@ccnet.u-kinoko.ac.jp:/home/toyo/kinoko/tmp
- スクリプトに MyCamac.kts を指定し,[Copy script files to remote DAQ hosts] をチェック
- 通常どおり [Construct] - [Start] - [Stop] - [Quit]
2回目以降は,上記手順5と7だけで同じことができるようになります.
CC/NET 側では,作業ディレクトリとして $KINOKO_ROOT/tmp を使用しています.この例のように,[Copy script ...] を使用する場合は,リモート側には一時ファイルだけを置くようにして,スクリプトやデータファイルなどは保存しないようにする方が安全です.NFS などでスクリプトファイルを共有する場合は [Copy script ...] も動作ディレクトリの指定も不要です.
上記設定のまま,SmallKinoko の起動コマンドをエイリアス設定すれば,あたかも Mac だけでデータをとっているかのような使用感を実現できます.スクリプトもデータファイルも全て Mac の側だけで編集と管理ができます.
alias smallkinoko-ccnet="smallkinoko --daqhost=toyo@ccnet.u-kinoko.ac.jp:/home/toyo/kinoko/tmp"
alias smallkinoko-ccnet "smallkinoko --daqhost=toyo@ccnet.u-kinoko.ac.jp:/home/toyo/kinoko/tmp"
この例では,状況を複雑にするために Mac を使っていますが,普通の Linux PC でも全く同じように動作します.KCOM_PATH の /Users を /home に読み替えるだけの違いです.
オートパイロットを使う
オートパイロットを使うと,コントロールパネルに対するマウスやキーボードの操作を自動化できます.これにより,一定時間ごとのランのスタート・ストップや,条件を変えながらのランのくり返しなどが自動で行えるようになります.
以下は,[START] ボタンと [STOP] ボタンを操作して,1 時間ごとに 10 分間のデータを取る動作を 10 回繰り返す例です.以下の内容のファイルを auto-startstop.kcms という名前で作成してください.
int run_count = 0;
on every (1 hour)
{
invoke start();
after (10 min) invoke stop();
}
on transition (from "stopping" to "system_ready")
{
run_count++;
if (run_count == 10) {
invoke quit();
}
}
SmallKinoko を起動し,スクリプトやデータファイル名を指定して,[Construct] をしてください.次に,コントロールパネルのメニューバーの [Action]-[LoadScript] でファイル選択ダイアログを開いて,auto-startstop.kcms を選択してください.これにより,オートパイロットスクリプトがロードされ,実行されます.
この例で作成されるデータファイルには,10回分のランのデータが格納されます.これを分離するには,コマンド kdfseparate を使います.
% ls *.kdf
foo.kdf
% kdfseparate foo.kdf
making foo-1.kdf...
making foo-2.kdf...
(略)
making foo-10.kdf...
% ls *.kdf
foo.kdf foo-1.kdf foo-2.kdf foo-3.kdf foo-4.kdf
(略)
on transition 文では,KCOM で(この場合は SmallKinoko で)定義された状態遷移をトラップできます.SmallKinoko では,以下のステートが定義されています.
- component_ready: 各コンポーネントの起動ができた状態.接続を行い,stream_ready に遷移する.
- stream_ready:コンポーネントの接続ができた状態.[Construct] と [Quit] ができる.
- constructing:[Construct] をしている途中の状態.完了して system_ready に遷移する.
- system_ready:データをとる準備ができた状態.[Construct],[Start],[Quit] ができる.
- data_taking:データをとっている状態.[Stop] ができる.
- stopping:データ収集の終了処理をしている状態.完了して system_ready に遷移する.
- shutdown:[Quit] 後の状態.
- error:エラーが起き,処理を進められない状態.[Quit] しかできない.
これを図にすると以下のようになります.
次はもう少し複雑な例です.ここでは,1時間ごとに10分間の通常ランと,その後1分間のペデスタルランを行います.通常ランとペデスタルランでは異なったスクリプトを使うことにし,データファイルも別々にします.
int run_count = 0;
bool is_physics_run;
on every (1 hour)
{
run_count++;
string data_file = "foo-physics-" + run_count + ".kdf";
system("rm -f " + data_file);
<readout_script>.setValue("SimCamacAdc.kts");
<view_script>.setValue("CamacAdc.kvs");
<data_file>.setValue(data_file);
<message>.setValue("AUTOPILOT: taking physics data...");
is_physics_run = 1;
invoke construct();
}
on transition (from "constructing" to "system_ready")
{
invoke start();
if (is_physics_run) {
after (10 min) invoke stop();
}
else {
after (1 min) invoke stop();
}
}
on transition (from "stopping" to "system_ready")
{
if (! is_physics_run) {
if (run_count == 10) {
invoke quit();
}
else {
<message>.setValue("AUTOPILOT: idling...");
}
return;
}
string data_file = "foo-pedestal-" + run_count + ".kdf";
system("rm -f " + data_file);
<readout_script>.setValue("SimCamacAdc.kts");
<view_script>.setValue("CamacAdc.kvs");
<data_file>.setValue(data_file);
<message>.setValue("AUTOPILOT: taking pedestal data...");
is_physics_run = 0;
invoke construct();
}
オートパイロット実行中にポップアップなどが出て実行が中断しないように注意してください.あまり安全ではありませんが,この例では,新しくファイルを作成する前に,同名のファイルを削除しています.
この例には,[Construct] ボタンの操作も含まれているので,オートパイロットスクリプトのロードは,[Construct] を行う前(すなわち SmallKinoko を立ち上げた直後)に行います.後は,オートパイロットがシステムの終了まで自動で行います.
この例のように,起動直後からロードできるスクリプトは,smallkinoko のコマンド引数で起動時に指定することもできます.
% smallkinoko auto-periodic.kcms
拡張子 kcms により,オートパイロットスクリプトであることが認識されます.
コントロールパネルをカスタマイズする
ここでは,コントロールパネルをカスタマイズして,ADC のステーション番号と読み出すチャンネルをコントロールパネルから指定できるようにしてみます.以下は,ここで作成するコントロールパネルの外観です.ステーション番号やチャンネルの入力フィールド追加されています.
コントロールパネルの構成は,コントロールパネルスクリプト (KCML スクリプト) により記述されています.これは,今までとは異なり,XML を用いたスクリプトになっています.ここでは,SMallKinoko で使っているコントロールパネルスクリプトをベースにして,それを改造することにします(ただし,通常の SmallKinoko のコントロールパネルは多機能で複雑すぎるので,ここでは最小機能を実装している SmallKinoko Lite を使います).SmallKinoko のスクリプト(とそこで使っている画像)を以下のように自分の作業ディレクトリにコピーしてください.
% cp $KINOKO_ROOT/scripts/SmallKinoko-Lite.kcml ./Trial02.kcml
% cp $KINOKO_ROOT/scripts/SmallKinoko.png .
Trial02.kcml を,以下のように編集してください.太字の行が追加する部分です.スクリプトは大文字と小文字を区別するので,下記の例のとおり入力してください.
1: <?xml version="1.0"?>
2:
3: <KinokoControlPanel label="SmallKinoko Control Panel">
4: <HSpace/><Image file="SmallKinoko.png"/>
5: <VSpace/>
6:
7: <HSpace/><Label name="message" label="Welcome to the Kinoko World." font="times-italic" size="14"/><HSpace/>
8: <VSpace/>
9:
0: <EntryList>
11: <Entry name="readout_script" label="ReadoutScript (.kts)" option="file_select"/>
12: <Entry name="view_script" label="ViewScript (.kvs)" option="file_select"/>
13: <Entry name="data_file" label="DataFile (.kdf)" option="file_select"/>
14: </EntryList>
15: <VSpace/>
16:
17: <Frame label="ADC Configuration">
18: <Entry name="station" label="Station" width="50" selection="1 2 3 4"/>
19: <Label label="Ch: "/>
20: <RadioButton name="enable_ch0" label="0"/>
21: <RadioButton name="enable_ch1" label="1"/>
22: <RadioButton name="enable_ch2" label="2"/>
23: <RadioButton name="enable_ch3" label="3"/>
24: <RadioButton name="enable_ch4" label="4"/>
25: <RadioButton name="enable_ch5" label="5"/>
26: <RadioButton name="enable_ch6" label="6"/>
27: <RadioButton name="enable_ch7" label="7"/>
28: </Frame>
29: <NewLine/>
30:
31: <Frame name="run_control" label="Run Control">
32: <ButtonList>
33: <Button name="construct" label="Construct" enabled_on="stream_ready system_ready"/>
34: <Button name="start" label="Start" enabled_on="system_ready"/>
35: <Button name="stop" label="Stop" enabled_on="data_taking"/>
36: <Button name="clear" label="Clear" enabled_on="system_ready data_taking"/>
37: <Button name="quit" label="Quit" enabled_on="stream_ready system_ready error"/>
38: </ButtonList>
39: </Frame>
40: </KinokoControlPanel>
このスクリプトが生成するコントロールパネルの外観は,コマンド kcmlcheck により確認することができます.
% kcmlcheck Trial02.kcml
次に,読み出しスクリプトの側を,コントロールパネルに設定された値を取得し,それを使うように変更します.Trial01.kts で,ステーション番号やチャンネルをハードコーディングしている部分(5行目 と 6行目)を削除し,以下の太字の部分を追加してください.ここで,getRegistry() が,コントロールパネルが設定したパラメータを取得する関数です.
1: /* Trial02.kts */
2:
3: datasource Trial02
4: {
5: int station = getRegistry("control/station");
6: int readout_channels;
7: for (int ch = 0; ch < 16; ch++) {
8: if (getRegistry("control/enable_ch" + ch) == "1") {
9: readout_channels |= #ch;
10: }
11: }
12:
13: CamacCrate crate;
14: CamacController controller("Toyo-CC7x00");
15: CamacModule adc("Rinei-RPC022");
16:
17: crate.installController(controller);
18: crate.installModule(adc, station_number);
19:
20: on trigger(adc) {
21: adc.read(readout_channels);
22: adc.clear();
23: }
24: }
作成した KCML スクリプトを引数にして,SmallKinoko を立ち上げてください.作成したコントロールパネルを持ったシステムが起動するはずです.
% smallkinoko Trial02.kcml
[Construct] する前に,ReadoutScript を Trial02.kts に変更するのを忘れないように注意してください.
なお,この例のように,特定の読みだしスクリプトを使用することを想定する場合,KCML の <Constant>タグを使うことにより,KCML スクリプトの中にハードコーディングすることもできます.
10: <EntryList>
11: <Entry name="view_script" label="ViewScript (.kvs)" option="file_select"/>
12: <Entry name="data_file" label="DataFile (.kdf)" option="file_select"/>
13: </EntryList>
14: <Constant name="readout_script" value="Trial02.kts"/>
コントロールパネルで独立アプリケーションを作る
コントロールパネルを記述する KCML スクリプトの中で <Script> タグを使うことにより,オートパイロットで使用した KCMS スクリプトの内容を直接 KCML の中に書くことができます.KCML スクリプトは kcmlcheck ツールで独立に動作させることができるので,これを利用することにより,Kinoko システムとは独立に動作するスタンドアローンのグラフィカルアプリケーションを作成することができます.実際,tinykinoko-graphical はこの仕組みを使って実装されています.
以下は,kcmlcheck を使って作成した例です.入力フィールドの値を10進数または16進数に変換します.
このプログラムは,1つの入力フィールドと2つのボタン,および改行や空白などのレイアウトウィジェットから構成されています.ソースコードは以下のようになっています.ボタンウィジェットの on_click 属性でボタンがクリックされたときに呼び出される関数を指定し,<Script> の中でその関数を定義しています.
<?xml version="1.0"?>
<KinokoControlPanel label="Dec-Hex Converter">
<Entry name="value" label="Value" alignment="right"/>
<NewLine/>
<HSpace/>
<Button label="HEX" on_click="convertToHex"/>
<Button label="DEC" on_click="convertToDec"/>
<Script>
<!--
void convertToHex() {
int value;
try {
value = (int) eval(<value>.getValue());
<value>.setValue("0x" + hex(value));
}
catch {
openPopup("ERROR", "OK", "invalid dec value");
}
}
void convertToDec() {
int value;
try {
value = (int) eval(<value>.getValue());
<value>.setValue(value);
}
catch {
openPopup("ERROR", "OK", "invalid hex value");
}
}
-->
</Script>
</KinokoControlPanel>
入力フィールドの値を getValue() で取得した後に eval() していますが,これは入力が計算式のときにその処理を行うためです.これにより,例えば 2 * 0x100 のような入力を処理できるようになっており,簡易電卓としても使用できます(上記プログラム中の int へのキャストを float にすれば関数電卓になります).
このプログラムは kcmlcheck で実行できます.
% kcmlcheck DecHexConverter.kcml
次はもう少し複雑な例です.UNIXコマンドの uptime を呼び出してロードアベレージを取得し,Kinoko Version 2 より導入された VisualWidget と Viewlet を使ってロードアベレージの現在値と推移をグラフィカルに表示します.
ソースコードは以下のようになっています.uptime コマンドの出力形式によっては getLoadAverage() 関数の中身を修正する必要があるかもしれません.文法の詳細については使用方法の章で説明します.
<?xml version="1.0"?>
<KinokoControlPanel label="Load Average Monitor">
<Label label="Load Average Monitor" font="helvetica-bold" size="14"/><HSpace/>
<VSpace/>
<Box>
<HSpace/>
<VisualGuage name="guage" min="0" max="3" foreground="red" wideness="20"/>
<HSpace/>
<NewLine/>
<VisualDisplay name="display" height="40" width="80" fg="lightgreen" bg="black" align="center"/>
</Box>
<Plot name="plot" width="370" height="300" xmin="0" xmax="100" ymin="0" ymax="3"/>
<Script>
<![CDATA[
on startup() {
reset();
}
on every (1 sec) {
update();
}
int start_time;
list x, y;
void reset() {
start_time = time();
x = {}; y = {};
<plot>.setTimeTick(start_time, "%H:%M'%S", "sec", 30);
}
void update() {
int time = time();
double value = getLoadAverage();
if (time - start_time > 100) {
reset();
}
x <+>= time;
y <+>= value;
<guage>.setValue(value);
<display>.setValue(value);
<plot>.draw(x - start_time, y);
}
double getLoadAverage() {
string uptime = shell("uptime");
$match = (uptime =~ m/[Ll]oad [Aa]verage: ([0-9\.]+)/);
return $match[1];
}
]]>
</Script>
</KinokoControlPanel>
強制終了と異常終了後のクリーンアップ
強制終了
データ収集中にハードウェアやネットワークなどに障害が起こると,Kinoko の一部の機能が応答しなくなり,停止や終了などができなくなることがあります(通信機構の一部を破壊することは常に可能です(ケーブルを抜くなど).Kinoko は現実的な状況で必要な性能を実現するために過剰なエラーチェックを行いません).Kinoko は応答がなくなった部分を切り離すこともありますが,状況によっては強制終了が必要になることもあります.
Kinoko を強制終了するには,Kinoko を起動したシェル上で Ctrl-c を押してください.
Kinoko は Ctrl-c によって発行されるシグナルを受けとると,最低限のクリーンアップを試みて終了します.エラーメッセージが出ることがありますが,ほとんどの場合はこれで十分です.次回起動時に残ったプロセスが異常終了してエラーメッセージを出すことがありますが,これも影響ありません.ほとんどの場合は不要ですが,気になる場合は次節のクリーンアップを手動で行ってください.
Crtl-c を押してもシェルプロンプトが復帰しない場合,Ctrl-\ (コントロールキーを押しながらバックスラッシュ)を試してください.これにより,Kinoko はクリーンアップを行わずに強制終了させられます.かなりの数のコアダンプファイルが生成されるので,気になる場合は削除してください.
それでもだめな場合は,カーネルの側へ影響が及んでいる可能性があります.実際に,デバイスドライバやネットワークインターフェース,NFSファイルシステムなどはこの種の問題を引き起こすことがあります(DMA転送中にモジュールが死亡した場合など).OS のリブートが必要です.
クリーンアップ
Kinoko が強制終了されたり異常終了したりすると,共有メモリなどのシステム資源が開放されずに残ったり,一部のプロセスが終了せずに走り続けたりすることがあります.これによって次の起動時に resource busy などのエラーが出たり,あるいは全く起動しなくなったりすることがあります.ただし,KiNOKO 2.3 より異常終了時のクリーンアップが強化されたため,実際にこれが起こることは稀です.また,起動時に前回の未開放資源の処理を行うので,実際にエラーによって実行に支障が生じることもまずありません.
SmallKinoko は,異常終了を検出すると cleanup.sh というクリーンアップスクリプトを自動で生成します.これを実行することにより,前回の SmallKinoko が使用した資源を強制的に全て削除することができます.
Kinoko は,状態の管理にロックファイルやフラグファイルのような永続的なものを一切使用しません.したがって,OS をリブートし,データ収集デバイスをリセットすれば,原理的に全ての状態が元にもどります.唯一の例外は,前回に生成された上書き禁止データファイルをデフォルトのままもう一度指定することにより生じるエラーです.動作していたシステムが突然クラッシュし,リブートしても復帰しない場合は,ハードウェアまたはネットワークやディスクの異常である可能性が高いです.
以下に,未開放資源を開放しなければならない場合の手順を示します.
自動クリーンアップスクリプトの利用
SmallKinoko は異常終了を検出すると,cleanup.sh というクリーンアップスクリプトを自動で生成します.これを実行することにより,前回の実行で使用した全てのリソース(プロセス,共有メモリおよびメッセージキュー)を強制的に削除することができます.
% smallkinoko
(途中省略)
(警告やエラーがたくさん:省略)
### Abnormal Termination Detected ###
'cleanup.sh' is generated.
% ./cleanup.sh
異常終了時でもほとんどのクリーンアップが行われるので,実際に cleanup.sh が何かをすることは稀です.cleanup.sh は「できなかった」というエラーメッセージを出すのが普通です(no such process など).
cleanup.sh の実行は異常終了の直後に行うようにしてください.実行が終わったら,cleanup.sh ファイルは削除して構いません(次回の SmallKinoko 起動時に自動で削除されます).
Small でない Kinoko を使ってる場合,クリーンアップスクリプトは kinoko-cleanup ユーティリティを使ってレジストリダンプファイルから生成させることができます.
% kinoko-cleanup kinoko-registry.xml > cleanup.sh
% chmod 755 cleanup.sh
% ./cleanup.sh
レジストリダンプファイルは,KCOM スクリプトにおいて saveRegistry(string file_name) 関数を呼び出すことにより生成できます.詳細については SmallKinoko.kcom ファイルを参考にしてください.
SmallKinoko が異常終了を検出できなかった場合,または異常終了が早すぎてクリーンアップスクリプトを生成するのに必要な情報を集められなかった場合は,cleanup.sh が生成されないので,次の手動によるクリーンアップを行ってください.
手動によるクリーンアップ
Kinoko は多数のプロセスに加えて,共有メモリとメッセージキューを使用します.UNIX 標準コマンドを使ってこれらの状態確認と削除を行うことができます.具体的なコマンド書式は OS によって微妙に異なるので,ここでは Linux 2.x を例にしています.
メッセージキューの削除
SmallKinoko は,2つのメッセージキューを使用します.現在使用中のメッセージキューは,コマンド ipcs で確認できます.
% ipcs
(途中省略)
------ メッセージキュー --------
キー msqid 所有者 権限 使用バイト数メッセージ
0x01039817 0 sanshiro 600 0 0
0x6503802e 1 sanshiro 600 0 0
Kinoko 以外がメッセージキューを使用していることはあまりないのですが,見分け方としては,所有者が自分で,パーミッションが 600 となっていることです.削除は,ipcrm コマンドに msqid を指定して行います.
% ipcrm msg 0
% ipcrm msg 1
この瞬間に,多くの Kinoko プロセスがエラーメッセージを出して異常終了します.
共有メモリの削除
SmallKinoko は,1つの共有メモリを使用します.現在使用中の共有メモリは,コマンド ipcs で確認できます.
% ipcs
------ シェアードメモリセグメント --------
キー shmid 所有者 権限 バイト nattch 状態
0x5b037c7f 3 root 644 1048576 0 対象
0x00000000 260 root 644 98304 16 対象
0x00000000 1157 sanshiro 777 65536 2 対象
0x00000000 1158 sanshiro 777 65536 2 対象
0x00000000 1159 sanshiro 777 65536 2 対象
(途中省略)
0x00000000 71365 sanshiro 777 65536 2 対象
0x00000000 71366 sanshiro 777 65536 2 対象
0x6403802e 73159 sanshiro 600 4194304 4
(以下省略)
GNOME などのデスクトップ環境を使用していると,多くの共有メモリが使用されます.Kinoko が使用している共有メモリの見分け方としては,所有者が自分で,パーミッションが 600 となっていて,サイズが 4194304 (または指定したサイズ)となっていることです.削除は,ipcrm コマンドに shmid を指定して行います.
% ipcrm shm 73159
生き残りプロセスの削除
まず,表示されている Kinoko 関係のウィンドウは全て閉じてください.つぎに,Kinoko 関連の生き残りプロセスを探します.
% ps -ef | grep inoko
sanshiro 1259 1 0 06:34 ttyp2 00:00:00 wish /home/sanshiro/work/kinoko/bin/kinoko-control-panel kinoko.awa.tohoku.ac.jp 10001
sanshiro 1273 1 0 06:34 ttyp2 00:00:00 KinokoController-kcom controller port: 10002
sanshiro 1277 1 0 06:35 ttyp2 00:00:00 KinokoCollector-kcom collector file: smallkinoko.log
sanshiro 1303 1285 0 07:23 ttyp5 00:00:00 grep inoko
ここで,grep をするときに inoko で探していることに注意してください.これは,kinoko の最初の K が大文字と小文字の両方があるためです.kill コマンドにより,これらを削除します.
% kill 1259
% kill 1273
% kill 1277
Kinoko のユーティリティに,grep による検索と kill を一度に行う簡単なスクリプト killgrep があります.これを使うと,上記の処理は以下のように行うことができます.
% killgrep inoko
sanshiro 1259 1 0 06:34 ttyp2 00:00:00 wish /home/sanshiro/work/kinoko/bin/kinoko-control-panel kinoko.awa.tohoku.ac.jp 10001
sanshiro 1273 1 0 06:34 ttyp2 00:00:00 KinokoController-kcom controller port: 10002
sanshiro 1277 1 0 06:35 ttyp2 00:00:00 KinokoCollector-kcom collector file: smallkinoko.log
commit? (y/n) > y
kill 1259
kill 1273
kill 1277
%
killgrep ユーティリティでは,標準の kill コマンドと同様に,送るシグナルをオプションで指定できます.
% killgrep -9 inoko
キーワード kcom,korb でも grep してプロセスが生き残っていないか確かめてください.以下のプロセスが生き残っている可能性があります.
kcom-manager
kcom-registry-server
korb-broker
korb-nameserver
どうしてもうまくいかない場合
オペレーティングシステムを再起動してください.全てのゴミは自動で削除されます(再起動後,必要なドライバ類を組み込むのを忘れないように注意してください).
Edited by: Enomoto Sanshiro