Apacheのセマフォ解放コマンド

セマフォとは

セマフォとは、並行動作しているプロセス間で同期を行ったり、割り込み処理の制御を実施するメカニズムまたはデータ型や信号のことです。もともとは「手旗信号」の意味を持っています。特に、複数のプロセスでメモリ内の領域やディスク上のファイルを共有している場合、同時にアクセスして内容の破壊や不整合が起きるのを防ぐために使われます。任意の数のリソースを扱うセマフォをカウンティングセマフォ、ロック・アンロックのために値が0と1に制限されているセマフォをバイナリセマフォといいます。

要は、並列動作しているプロセス間のリソース制御をよしなに調整してくれるのが、コンピュータの世界におけるセマフォの役割になります。

Apacheのセマフォ障害

Apacheに限りませんが、このセマフォによる排他制御がうまく行っていない場合、アプリケーションが起動しなくなる場合があります。例えばApacheで、ディスクやメモリに余裕があるのに、以下のエラーログが出てApacheが起動しない場合、セマフォが詰まっていることが原因として考えられます。

[crit] (28)No space left on device: mod_rewrite: could not create rewrite_log_lock Configuration Failed

このようなエラーが出た場合には、セマフォの状態を確認して見ることをオススメします。

セマフォの状態を確認するコマンド

セマフォの状態は、ipcsコマンドで確認できます。

ipcs

------ 共有メモリセグメント --------
キー     shmid      所有者  権限     バイト  nattch     状態      

------ セマフォ配列 --------
キー     semid      所有者  権限     nsems     
0x00000000 0          root       600        1         
0x00000000 32769      root       600        1         
0x00000000 3145730    apache     600        1         
0x00000000 3178499    apache     600        1         

------ メッセージキュー --------
キー     msqid      所有者  権限     使用バイト数 メッセージ

セマフォのデータだけ見たい時には、ipcsに-sオプションを付けます。

ipcs -s

------ セマフォ配列 --------
キー     semid      所有者  権限     nsems     
0x00000000 0          root       600        1         
0x00000000 32769      root       600        1         
0x00000000 3145730    apache     600        1         
0x00000000 3178499    apache     600        1 

ここでApache関連のセマフォがずらっと大量に並んでいたら、Apacheユーザーのセマフォに何らかの問題が発生して、Apacheの起動を妨げている可能性があるので、Apacheのセマフォだけをクリアにする必要があります。

Windowsのセマフォの場合

WindowsのCygwinでApacheを動作させている場合は、セマフォの問題が発生すると以下のようなエラーが出ます。

No space left on device: Couldn't create accept lock

ipcsで確認した際の内容も以下のように出力されます。

ipcs -s
 Semaphores:
 T     ID               KEY        MODE       OWNER    GROUP
 s  65536                    0 --rw-------   SYSTEM Administrators
 s 196609                    0 --rw-------   SYSTEM Administrators
 s 262146                    0 --rw-------   SYSTEM Administrators
 s 262147                    0 --rw-------   SYSTEM Administrators
 s 262148                    0 --rw-------   SYSTEM Administrators
 s 262149                    0 --rw-------   SYSTEM Administrators
 s 262150                    0 --rw-------   SYSTEM Administrators
 s 262151                    0 --rw-------   SYSTEM Administrators
 s 262152                    0 --rw-------   SYSTEM Administrators
 s 262153                    0 --rw-------   SYSTEM Administrators

Apacheのセマフォの削除

Apache関連のセマフォは以下のコマンドで削除できます。

sudo ipcs -s | grep apache | perl -e 'while (>STDIN<) { @a=split(/\s+/); print `ipcrm sem $a[1]`}'

上記は一括削除の場合ですが、# ipcrm -m (ID)で一個一個消していってもかまいません。Apacheのセマフォクリアはrootユーザーから実行することになると思いますが、間違って他のユーザーのセマフォを消してしまわないように気をつけましょう。

これでApacheが正常稼働できるようになります。