Shell の基礎知識

【Shell-Tips】多重起動の禁止処理を実装しよう。

2021年3月11日

特定用途のスクリプト実装後、クーロンにより毎日決まった時間に処理が実行されることを期待していたが「いつの間にかプロセスが落ちていた・・」

しかも「何時?プロセスが落ちたのか分からない」など、異常に気づいたころには「実は数ヶ月前から処理が止まっていた。」などはよくある話です。

大抵の場合、原因は多重起動処理の禁止ロジックを実装していないがために起こる悲劇です。

この問題を回避するべく「多重起動処理」を禁止にする仕組みを実装します。

多重起動禁止処理の作成

定期的に実行するスクリプトが何らかの原因により、正常に実行できずに止まってしまう(キューイング)場合、(翌日の定時などに)後から起動された同一スクリプトのプロセスは次々にOSにキューイングされて行きます。

当然キューイングされたプロセス数分のリソースが消費され、やがてリソース不足に陥りシステムがダウンしてしまいます。

多重起動処理禁止に必要な機能

  • ロック機能
  • アンロック機能
  • 処理の中断機能

上記3つの機能を実装して、多重起動処理検知時に当該プロセスを停止します。

前提

Beエンジニアでシェルスクリプトを実行する環境は下記の通りとします。

実行環境

BASE_DIR(任意のディレクトリ)

  • scripts
    • bin(実行スクリプト格納領域)
      • func.sh (実行ファイル)
    • com(共通スクリプト格納領域)
      • comFunc.shrc(共通関数定義ファイル)
    • etc(設定ファイル等の格納領域)
      • message.conf(メッセージ定義ファイル)
    • log(スクリプト実行ログの格納領域)
      • スクリプト名.log 
    • tmp(テンポラリ領域)
    • rep(レポート出力領域)

本処理の仕組みは、共通で使用することを前提に共通関数定義ファイル「comFunc.shrc」へ実装します。

ロック機能

スクリプトが起動した時点で「/tmp」ディレクトリ配下へ「スクリプト名.lock」ディレクトリを作成し、当該スクリプトが実行中であることを後続の同一スクリプトへ知らせるためのファイル「pid」ファイルを作成します。

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

アンロック機能

当該スクリプトが終了した時点で「/tmp」ディレクトリ配下の「スクリプト名.lock」ディレクトリを削除します。

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

処理の中断機能

既に、同一スクリプトが実行中である場合、後発の同一スクリプト処理を中断します。

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

呼び出し側のシェルスクリプト作成

実行ファイルへ多重起動禁止処理を実装し、実行後30秒間のスリープ処理を記述します。同一スクリプトを時間差で実行します。つまり後発スクリプトが先発スクリプト追い越すことを禁止します。

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

多重起動禁止処理の実行結果

別々のコンソールから「func.sh」をそれぞれ実行します。

2行目:一発目のスクリプトがPID:17492で実行されました。
3行目:ロック機能により、ロックディレクトリが作成されました。
4行目:一発目のスクリプト(PID:17492)の成功ログが出力されています。
5行目:2発目の同一スクリプトがPID:17502で実行されました。
6行目:既にロックディレクトリが存在するため、新たなディレクトリの作成に失敗。
7行目:2発目の同一スクリプト処理が中断されました。
8行目:一発目のスクリプトの処理が実行されています。
9行目:一発目のスクリプトが正常に終了しました。

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

よく読まれている記事

1

目次1 Shellとは?1.1 代表的なシェルの種類2 シェルスクリプトの違いとは? Shellとは? Shellとは、人間の理解できる言葉を機会へ伝えるプログラムです。 Linux環境でコマンドプロ ...

2

Linuxは主にサーバー用として利用されるOSです。大規模な基幹システムの開発者、ロボットや家電開発等の組み込み系エンジニア、ネットワーク機器やデータベースに携わるインフラエンジニアは触れることが多い ...

3

プログラミング言語を習得しようと思った時、必ずと言っていいほど候補として挙げられるのが「Java」というプログラミング言語です。 「Java」は、現在日本で最も使われている言語であり、非常に人気のある ...

4

この記事は、Linuxについて勉強している初心者の方向けに「Shellスクリプト」について解説します。最後まで読んで頂けましたら、Shellスクリプトはどのような役割を担っているのか?を理解出来るよう ...

-Shell の基礎知識

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