Shellスクリプト

【Shell-TIps】シェル中断処理「Trap」を実装する。

2020年5月10日

システムの運用を行ってくうちに、ディスク容量の枯渇やネットワークの瞬断などが原因で、思わぬ障害に出くわすようになってきます。

そこで、実行シェルに問題が発生した場合などに備え、予め中断ロジックを作成してみます。

「trap」コマンドを使用して、シェルを中断する

シェルには、予め組み込みコマンドとして「trap」コマンドが用意されています。

拾えるシグナルは下記になります。

シグナルシグナル名意味
0-プロセス終了時に送出する EXIT シグナル
1HUPハングアップシグナル
2INT割り込みシグナル(Ctrl+C や Del キー)
3QUIT プログラム実行中止のクイットシグナル
9KILLプロセスの強制終了
※ 故意による強制終了なのでtrapでは拾えない
15TERMプロセスを終了させるための終了シグナル

コマンドの書式

trap [アクション] シグナル 

シェルスクリプトが、シグナルに指定した(複数書けます)シグナルを受け取ったとき、どういう処理をするかをアクションのところに指定します。

アクションには、関数名を指定して、シグナル取得時に関数を実行させることが可能です。

Abortメッセージの作成

メッセージ設定ファイルへ、トラップを拾った際に出力するメッセージを追加しておきます。

[ <BASE_DIR>/scripts/etc/message.conf ]

message.conf

W-00001 user.warn "The shell script aborted the process. Check the log for the cause."
E-00001 user.err " The number of arguments is incorrect. args_count: ["$#"]"

実行シェルスクリプトの作成

簡単な流れ

  • 実行シェルへ「sleep」コマンドを実行させて15秒間待機状態にします。
  • キーボードから「Ctr + C(INT)」を入力して割り込みします。
  • シェルスクリプトは、「abort」関数を呼び出しシェルを中断します。

今回は、「abort」関数へ、外部ファイルから取得したアボートメッセージをログへ出力させてみます。

[ <BASE_DIR>/scripts/bin/func.sh ]

実行結果を見てみます。

1行目:シェル実行(sleep待機中)
2行目:「Ctr + C」で割り込み実行
5-6行目:ログを確認します。
アボート処理を行った旨のメッセージがログに出力されていることが分かります。

今回は、ログ出力で「trap」コマンドの確認を行いましたが、実際には、シェル実行中に作成した中間ファイルの削除や、マウントポイントをアンマウントしておく等、後処理を記述しておくことが一般的な使い方となります。

本スクリプト利用により発生した利用者の損害全てに対し、いかなる責任をも負わないものとし、損害賠償をする一切の義務はないものとします。

よく読まれている記事

1

独立前は、誰もが不安でいっぱい。近い将来、フリーランスとして独立を考えている方が独立初期に躓かないために「独立前にやるべきことチェックリスト」をご紹介します。 当記事は前編となる「お金まわり編」。全て ...

2

ゲームなどのエンタメ分野での導入が進んでいるVR。言葉自体は耳にしたことがあっても、その意味を詳しく知らないという人も多いのではないでしょうか。また、次世代の新たな技術をビジネスに積極的に活用していく ...

3

フリーランスの確定申告には、青色申告と白色申告の2種類があります。いったいどちらの申告方法を選ぶべきなのでしょうか。 この記事では、青色申告と白色申告、それぞれのメリット・デメリットを把握することでベ ...

4

フリーランスの仕事場は、自宅をはじめとし、カフェや図書館、コワーキングスペースなど自由に選べます。しかし全ての場所で100%集中ができるどうかは、人それぞれです。どのような環境が自身の仕事場として快適 ...

5

フリーランスのITエンジニアとして、一番難しいのは「自己管理」と言えるでしょう。 自分の体調管理はもとより、仕事のスケジュール等すべて自分で管理します。もちろんフリーランスに有給休暇等ありませんから休 ...

-Shellスクリプト

Copyright© Beエンジニア , 2020 All Rights Reserved.