SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

HRzine Day(エイチアールジン・デイ)は、人が活き会社が成長する人事のWebマガジン「HRzine」が主催するイベントです。毎回、人事の重要課題を1つテーマに設定し、識者やエキスパードが持つ知見・経験を、参加者のみなさんと共有しています。

直近開催のイベントはこちら!

HRzine×SmartHR 人材・組織活性化フォーラム

2024年12月6日(金)13:00~15:30

主要製品スペック一覧

人事業務の効率・確度・精度を高めるために欠かせないHRテクノロジー。その主な製品の機能を分野ごとに比較できる資料群です。製品検討の参考資料としてご活用ください。

eラーニング・LMS<br>主要製品スペック一覧 2024

eラーニング・LMS
主要製品スペック一覧 2024

その他のスペック一覧

人事労務管理システム<br>主要製品スペック一覧 2023

人事労務管理システム
主要製品スペック一覧 2023

タレントマネジメントシステム<br>主要製品スペック一覧 2023

タレントマネジメントシステム
主要製品スペック一覧 2023

ドラゴン大竹のLPICレベル1 弱点克服クラス(Ver 4対応)| 第3回

【LPICレベル1】弱点「シグナルによるプロセスの制御」を克服する


  • Facebook
  • X
  • Pocket
  • note
  • hatena

SIGTERMの受信設定と動作例 - Apache httpd デーモンの場合 -

次に、Linuxディストリビューションで提供されている代表的なプログラムにおけるシグナルハンドラの実装例を見てみましょう。まずは主要なLinuxディストリビューションで提供されているApache Webサーバのpreforkモデルについて見ていきます。

preforkモデルでは、親プロセス(httpd)が子プロセスを先行して生成し、1つの子プロセスが1つのリクエストを処理します。

シグナル処理はhttpdの本体からリンクされたモジュールmod_mpm_prefork.soによって行われます。この中で、親プロセスはシグナルハンドラsig_term()の登録を行い、SIGTERMシグナル受信時にクリーンアップ処理を行います。親プロセスのシグナルハンドラの登録にはsigacton()を、子プロセスのシグナルハンドラの登録にはsignal()を使用しています。

httpdのSIGTERMシグナルハンドラ
httpdのSIGTERMシグナルハンドラ

図「httpdのSIGTERMシグナルハンドラ」の①~③で実行されている動作

  • ① 親プロセスはシステムコールsigaction()によりシグナルハンドラsig_term()を登録(子プロセスはシステムコールsignal()によりシグナルハンドラjust_die()を登録)
  • killコマンドによりhttpdの親プロセスにSIGTERMを送信
  • SIGTERMシグナルを受信したhttpd(親)のシグナルハンドラsig_term()は終了待ちフラッグを立て、それを検知した処理ルーチンはSIGTERMシグナルの送信によって、すべての子プロセスを終了させ、最後に親プロセス自身が終了。

このように、httpdはSIGTERMシグナルを受信するとクリーンアップ処理をしてから終了します。

ただし、httpdの親プロセスをSIGKILLシグナルによって強制終了した場合、クリーンアップ処理が行われず、子プロセスが残ってしまいます[1]。httpdの親プロセスが消滅した場合は、子プロセスに対して設定ファイルに従った正しい制御ができず、またSysVinitのserviceコマンドやsystemdのsystemctlコマンドでも制御ができなくなります[2]

SIGTERMとSIGKILLの違い

httpdの例で見てきたように、SIGTERMシグナルを受信したプロセスはクリーンアップ処理を実行して終了し、SIGKILLシグナルを受信したプロセスはシグナルを捕捉できないためクリーンアップ処理を実行できずに終了します。WebブラウザのFirefoxやメールクライアントのThunderbird(共にLinux版)では、終了時のクリーンアップ処理の中でロックファイル(lock)を削除して終了しますが、SIGKILLシグナルを送信して終了させた場合には、ロックファイルは削除されずに残ってしまいます。このため、次回起動時にはロックファイルを削除してからでないと起動できません。

このように、外部からシグナルを送信してプロセスを終了させる場合には、プロセスがクリーンアップ処理を実行することのできないSIGKILLシグナルによる強制終了ではなく、プロセスがクリーンアップ処理を実行するSIGTERMシグナルによる終了が推奨されます[3]

SIGHUPの受信設定と動作例 - BIND named デーモンの場合 -

BIND named、Apache httpd、xinetdなどのデーモンプログラムは、SIGHUPシグナルを受信すると設定ファイルを再読み込みするように実装されています。このようなデーモンは、設定ファイルを編集した後にSIGHUPシグナルを送信することで、再起動によるサービスの中断なしに設定ファイルの内容を有効にすることができます[4][5]

ここではDNSサーバ「BIND named」(以下、named)のシグナル処理を例として見ていきます。namedはsigacton()を使用してシグナルハンドラreload_action()を登録し、SIGHUPシグナル受信時に設定ファイルの再読み込みを行います。

BIND namedのSIGHUPシグナルハンドラ
BIND namedのSIGHUPシグナルハンドラ
  • ➀ システムコールsigaction()により、シグナルハンドラreload_action()を登録
  • killコマンドによりnamedにSIGHUPシグナルを送信
  • SIGHUPシグナルを受信したnamedのシグナルハンドラreload_action()は設定ファイルnamed.confとゾーンファイルの再読み込みを行う

[1]: 親プロセスが子プロセスの終了処理をせずに強制終了で消滅した場合、SysVinitを採用しているシステムではinitプロセスが、systemdを採用しているシステムではsystemdが代わって親になります。

[2]: この場合、killallコマンドやpkillコマンドなどで、すべての子プロセスを終了させる必要があります。

[3]: SIGKILLシグナルは、設定あるいは動作異常によりSIGTERMシグナルの処理を行わないプロセスを強制終了する場合に使用します。

[4]: SIGHUPシグナルを受信すると再起動するデーモンもあります。また、デフォルトのハンドラが起動してプロセスが終了するデーモンもあります。

[5]: Apache httpdの場合、SIGHUPシグナルを受信した親プロセスは設定ファイルを再読み込みし、子プロセスを再起動します。

次のページ
模擬問題に挑戦

この記事は参考になりましたか?

  • Facebook
  • X
  • Pocket
  • note
  • hatena
ドラゴン大竹のLPICレベル1 弱点克服クラス(Ver 4対応)連載記事一覧

もっと読む

この記事の著者

大竹 龍史(有限会社ナレッジデザイン)(オオタケ リュウシ)

有限会社ナレッジデザイン 代表取締役。1986年 伊藤忠データシステム(現・伊藤忠テクノソリューションズ(株))入社後、Sun Microsystems社のSunUNIX 3.x、SunOS 4.x、Solaris 2.xを皮切りにOSを中心としたサポートと社内トレーニングを担当。1998年 (有)ナレッジデザイン設立。Linux、Solarisの講師および、LPI対応コースの開発/実施。約27年にわたり、OS の中核部分のコンポーネントを中心に、UNIX/Solaris、Linuxなどオペレーティングシステ...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事をシェア

  • Facebook
  • X
  • Pocket
  • note
  • hatena
HRzine
https://hrzine.jp/article/detail/51 2016/10/04 12:17

Special Contents

AD

Job Board

AD

おすすめ

アクセスランキング

アクセスランキング

イベント

HRzine Day(エイチアールジン・デイ)は、人が活き会社が成長する人事のWebマガジン「HRzine」が主催するイベントです。毎回、人事の重要課題を1つテーマに設定し、識者やエキスパードが持つ知見・経験を、参加者のみなさんと共有しています。

2024年12月6日(金)13:00~15:30

イベントカレンダーを見る

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング