日本ソフトウェア科学会第 30 回大会 (2013 年度) 講演論文集

高信頼なシェルスクリプト D-Shell の提案
関口 渚

井出 真広

倉光 君郎

システム運用には従来シェルスクリプトが利用されてきたが，その信頼性は十分とはいえなかった．システムの運用を高信頼に行うためには，シェルスクリプトには，運用が失敗した際に要因を推定できることが求められる．我々は，シェルスクリプトの利便性を生かしつつ，高信頼化することを目的として，例外処理機能を備えたシェルスクリ
プト D-Shell を提案する．D-Shell は，シェルスクリプトと互換性のある文法をサポートし，さらに例外処理機能をもつ．本論文では，D-Shell の例外処理機能について紹介する．

While shell scripts have been used in system operation up to now, they are not suﬃcient to rely on. In orderto operate systems high reliably, shell scripts need to infer a cause when operation has failed. We proposea shell script having exception handling named D-Shell for the purpose of making the most of the convenience of shell scripts and enhancing the reliability of them. D-Shell supports shell script compatible syntax.
Furthermore, it has the exception handling. In the paper, we introduce D-Shell’s exception handling.

本論文の構成は以下の通りである．第 2 節では研1 はじめに究の動機について述べる．第 3 節は D-Shell の設計

シェルスクリプトは，システム運用や障害対応などについて述べる．第 4 節では D-Shell の評価実験にに利用されてきた．シェルスクリプトは Unix システついて述べる．第 5 節では関連研究について述べる．

ムであれば，どこでも利用可能という利便性と障害管

第 6 節では本論文の結論を述べる．

理に必要な OS やシステムリソース情報へのアクセス透過性を備えている．

2 動機

障害対応は，それ自体が高信頼に実行される必要が

本節ではシェルスクリプトの機能とシェルスクリプある．障害対応を行うスクリプトを実行する処理系

トを用いた高信頼なシステム運用への適応に向けたは，高信頼にスクリプトを実行するために例外処理課題を述べる．

機能を備えている必要がある．しかしながら，従来のシェルスクリプトは古くは Bourn シェル (sh, bash)

シェル処理系は，例外処理機能を備えていない．したや csh などが提供してきたプログラムである．これらがって障害対応を行うのに十分な機能を有しているとのシェルスクリプトはほとんどの UNIX システムでは言いがたい．

利用可能である．シェルスクリプトは OS やシステム

本論文ではシェルスクリプトの利便性を生かしつつ，リソースへの読み書き操作，ジョブ管理などをコマン

障害対応を高信頼に実行することを目的としたシェ

ドラインから行うことができ，簡単な関数定義や制御

ルスクリプト処理系 D-Shell を提案する．D-Shell は構文などプログラミング言語としての機能を備えてシェルスクリプトと互換の文法を持ち，また近代的ないる．

プログラミング言語が持つ例外処理機能を有する．

しかし，Bourn シェルなどシェルスクリプト処理系は，近代的なプログラミング言語の多くが持つ例

D-Shell:A Reliable Shell Script.
Nagisa Sekiguchi, Masahiro Ide, Kimio Kuramitsu, 横浜国立大学, Yokohama National University.

外処理機能をもたない．例えば，シェルスクリプトの中で実行される UNIX コマンドは戻り値を見ることで実行に失敗したかどうかわかる．しかし，戻り値が示すエラーの内容はコマンドによって様々であり，戻り値をもとに処理系レベルで統一的なエラー処理を行うのは困難である．シェルスクリプト処理系では

set -e コマンドや trap コマンド [6] を組み合わせることで，コマンドの実行に失敗した際にスクリプトに記述された回復処理を行うことができる．しかし，実行失敗の原因がわからないため，失敗原因に応じた適切な回復処理を行うことができない．
我々はシステム運用を高信頼に実行するため，シェルスクリプト処理系には障害発生の際にエラーを統

図1

D-Shell の例外機構一的に処理できることが要求されると考える．この要求を満たすために，例外処理機能をもつシェルスクリ

• 実行されたシステムコール名

プト処理系 D-Shell を設計した．

• システムコールの引数と戻り値• システムコールのエラーコード

3 D-Shell の設計
本節では，D-Shell の設計について述べる．

D-Shell 上でコマンドが実行されると自動的に straceコマンドが実行され，システムコールのモニタリングが行われる．strace コマンドで取得した情報はログ

3. 1 概要ファイルに書き出される．

D-Shell は 3 つの部分からなり，モニタ，例外発行機構，例外処理機構がある．D-Shell は UNIX コマン

3. 3 例外発行機構

ドが発行するシステムコールをモニタリングし，それ例外発行機構は，コマンドが異常終了した際，straceをもとに例外発行を行う．

コマンドによって取得したログの中からエラーが発

図 1 は D-Shell の例外機構を示したものである．ス

生したシステムコールを取り出し，エラーコードをクリプト上の UNIX コマンドが発行したシステムコーもとに例外発行をする．なお，異常終了時に発生すルは，モニタによってモニタリングされる．モニタはるシステムコールエラーは一つであるとは限らない．

システムコールログをファイルに書き出す．UNIX コ

通常，複数のシステムコールエラーが発生するため，マンドが異常終了した際に，例外発行機構がログファ異常終了の原因となるエラーを判定する必要がある．

イルを読み込み，システムコールログから異常終了の

本論文では，コマンドの実行終了直前に発生したシス原因となる例外を推定し，例外発行をする．発行されテムコールエラーが，異常終了の原因であるとした．

た例外は例外処理機構によって処理される．

3. 4 例外処理機構
3. 2 モニタ

例外処理機構は，例外発行機構で発行された例外をモニタリング機構では，UNIX コマンドが発行し捕捉し，その内容に応じて適切なブロックへ処理を移たシステムコールのモニタリングを行う．システム

す．その後，遷移先のブロック中に記述された処理がコールのモニタリングには strace コマンドを用いる．

実行される．

strace コマンドは対象となる UNIX コマンドのシステムコールを監視するもので，以下のような情報を取得することができる．

• システムコールを実行したプロセスの ID

4 実験
本節ではいくつかの UNIX コマンドを対象とし，実行の際に意図的にエラーを発生させ，適切な例外が発生させたエラー

発行された例外a) アクセス権限がない

NotPermittedExceptionb) ファイルが存在しない

NotFoundExceptionc) ディスクの空きがない

NoFreeSpaceExceptiond) ファイルシステムが読み込み専用

ReadOnlyExceptione) 接続先がタイムアウトした

NetworkTimeoutExceptionf) ルーティング先が間違っている

UnreachableExceptiong) 接続先でデーモンが動作していない

ConnectRefusedException

5 関連研究限定的でありながらも，例外処理機能をもつシェルスクリプト処理系がいくつか提案されている．本節では例外処理機能をもつ既存の処理系と D-Shell の比較を行う．

PowerShell [5] は.NET Framework [3] を基盤とするシェルスクリプト処理系である．PowerShell 上で表1

実験結果

実行されるコマンドは.NET Framework のクラスとして実装されているため，例外を発行することができ発行されることを確認する．

る．しかし，PowerShell は.NET Framework の例外処理機能を利用しているため，.NET Framework 上

4. 1 実験内容

で動作しないコマンドは例外処理を行うことができ

ls コマンド，dd コマンド，rsync コマンドを対象とない．一方，D-Shell は UNIX コマンドのシステムし，これらのコマンドを D-Shell 上で実行するの際にコールログをもとに例外処理を行うため，コマンドの意図的にエラーを発生させた．このとき，D-Shell が修正や再実装が必要ない．

発行する例外と発生させたエラーの原因が対応するか調べた．
以下が実際に実行したコマンドと発生させたエラーである．

• ls -la ./hogea) アクセス権限がない

BeanShell [1] は JavaVM 上で動作するシェルスクリプト処理系である．BeanShell では Java と互換性のある文法をサポートする．BeanShell も例外処理機能をもつが，やはり Java クラスで発生した例外を処理するだけであり，既存のコマンドの例外処理を行うことはできない．

b) ファイルが存在しない

DCL [4] は OpenVMS [2] 用のシェルスクリプト処• dd if=/dev/sda1 of=./hoge

理系である．OpenVMS のシステム管理に用いられc) ディスクの空きがないている．DCL では，特定のコマンドを用いることで，

d) ファイルシステムが読み込み専用

コマンドが異常終了した際に例外セクションに記述さ• rsync -av ./ rsync://example.com/dest

れた回復処理を行うことができる．しかし，異常終了e) 接続がタイムアウトしたの原因はわからないため，原因に応じた回復処理をf) ルーティング先が間違っている

行うことはできない．D-Shell は異常終了の原因を推

g) 接続先でデーモンが動作していない

定し，適切な例外を発行するため，原因に応じた回復

ls コマンドでは a),b) のエラーを，dd コマンドでは c),d) のエラーを，rsync コマンドでは e),f),g) の処理を行うことができる．この点が DCL と大きく異なる．

エラーを発生させた．

6 結論
4. 2 結果

本論文ではシェルスクリプト中で実行されるシス

表 1 はコマンド実行の際に発生させたエラーとテムコールを監視し，コマンドの失敗時に，システム

D-Shell が発行した例外をまとめたものである．表よコールエラーの履歴をもとに例外を送出し，処理する

り，発生させたすべてのエラーについて適切な例外が機能をもつシェルスクリプト処理系 D-Shell を提案し発行されたことを確認した．

た．実験よりシェルスクリプト中で発生したエラーをD-Shell が捕捉し，正しく例外を送出することを確認

した．今後は，システムコールを用いたエラー判定方法についてより汎用的な判定方法の検討を行う．
謝辞 本研究は，JST/CREST「実用化を目指した組込みシステム用ディペンダブル・オペレーティングシステム」領域の研究助成を受けて行われた．

参 考 文 献[1] : BeanShell Lightweight Scripting for Java, http://www.beanshell.org/.

[2] : OpenVMS Systems, http://h71000.www7.hp.
com/.
[3] : Overview of the .NET Framework, http://msdn.microsoft.com/en-us/library/zw4w595w.aspx.
[4] : Simplifying Maintenance with DCL, http://h71000.www7.hp.com/openvms/journal/v9/simplifying_maintenance_with_dcl.pdf.
[5] Holmes, L.: Windows powershell quick reference,
O’Reilly, first edition, 2006.
[6] Newham, C.: Learning the bash shell, third edition, O’Reilly Media, Inc., 3 edition, 2005.