USP研究所ロゴマーク

ユニケージ Q&A

1. 排他制御はどうするのですか

ulock コマンドを使用します。ulock コマンドはロックファイルを排他的に作成します。また、そのロックファイルが存在する間は、待ち続けます。

実際の記述例を示します。

例)

							
if ulock lockfile; then

	###############################
	# 排他的に行いたい処理を記述
	###############################

	# 最後にロックファイルを消去する
 rm lockfile
fi
						

ulock コマンドにはタイムアウトや古いロックファイルの消去、シェアードロックなどの機能もあります。

2. リレーションはどのように行うのですか

ユニケージで使用するデータは整理されたテキストファイルです。リレーションを実現するために、ユニケージでは、ファイル同士を連結し、連結結果を標準出力にだす各種コマンドが用意されています。列数/項目指定、InnerJoin/OuterJoin など様々なバリエーションがあります。

例) Masterの1列目とTranの2列目をキーにして2つのファイルを連結

							
$ cat MASTER
001 Japan
002 America

$ cat TRAN
a 001 100
b 001 200
c 002 300
d 003 400

$ join1 key=2 MASTER TRAN > RESULT
$ cat RESULT
a 001 Japan 100
b 001 Japan 200
c 002 America 300
						

3. エラーハンドリングはどうなっているのか

シェルスクリプトでは各コマンドの終了ステータスコードを捕捉することができます。bash においては、パイプでつながれた各コマンドの終了ステータスは配列変数PIPESTATUSに収められ、それが全部0なら正常終了と見なされます。

エラーハンドリングのコード例を示します。plus コマンドは引数の数値をすべて足した結果を標準出力にだします。

							
function ERROR_CHECK()
{
	 [ $(plus ${PIPESTATUS[@]}) -eq 0 ] && return 0
	 echo error:$1
	 exit 1
}

command1   |
command2   |
command3   > result
ERROR_CHECK $LINENO
						

4. ロールバックはできるのか

ユニケージのコマンドは入力ファイルを処理して別の出力ファイルに結果を書き出します。つまりどの時点においても、処理の元ファイルと結果ファイルは別であり、重要なファイルは常に保存しています。

例えばマスターの更新では、次のようにすべての更新前後のファイルを残します。シンボリックリンクでファイルを同名参照できるようにします。リンクを切り替えるだけでいつの時点にでもロールバックすることができます。

							
if ulock lockfile; then
	time=$(date +%Y%m%d%H%M%S).$$
	upl key=1 MASTER TRAN > MASTER.$time
	rm MASTER
	ln -s MASTER.$time MASTER
	rm lockfile
fi
						

5. DBと共存できるのか

各DBに接続できるクライアントコマンドを利用します。たとえばSQL Server に接続するには、unixODBC と FreeTDSをインストールし適切な設定を行えば

							
$ tsql -S mssql -U username -P password
						

でDBにシェルスクリプトからアクセスできます。

Oracle ならば、Instant Client パッケージをインストールして sqlplus コマンドを使います。ユーザー情報などDBで一元管理されている情報をDBより取り出してユニケージで利用するときなどに使います。トランザクションデータなどは、DBからCSVファイルに出力してもらいそれをシェルスクリプトで利用するケースが多いです。

6. データアクセスに対するセキュリティは?

一般にユニケージでデータアクセスに対するセキュリティ対策を講じるときは、クライアント側は、一旦ウエブサーバーとCGIなどのプログラムを介してデータにアクセスするようにシステム構築し、直接データを持っているサーバーにログインして端末操作できないようにします。その上で、権限体系によるデータのアクセス制御はアプリケーションで実装します。

個人情報などの重要情報は暗号化コマンドを使います。復号時にもパイプを使ってストリーム処理しますので、処理途中にファイルやメモリ上に展開されることはありません。

7. コマンドインサートなどの攻撃に対する対処は?

ユニケージによる入力データはファイルに納め、ファイルのままコマンドのみで加工するのを基本とし、データをシェル変数にセットすることを少なくしています。データのチェックもファイルに対して行うことができるコマンドが用意されています。

さらに、exec/eval/:/source コマンドのチェックシェル変数を行の先頭においていないかのチェックawk の system 関数などのチェックができる「お作法チェッカー」スクリプトがあり、不法アクセスを誘引する記述の排除を行います。

8. ウエブアプリケーションをCGIで記述するとプロセス過多にならないか

プロセス数が数千程度だと今の標準的なサーバーだと問題はありません。万オーダーになってとるべき対策は、CGI 内部で次のような処理順番待ちを行う仕組みを入れます。

							
semwait --less_than 10 "semaphore.*"
touch semaphore.$$
##############
# 実際の処理
##############
rm semaphore.$$
						

これで解決しないようなオーダーのアクセスに対してはFastCGI 設定してウエブアプリケーション自体をサーバー化してプロセス数を増やさないようにします。

©2014 Universal Shell Programming Laboratory