プロセスの再起動に失敗する場合

  • 投稿日:
  • by
  • カテゴリ:

サーバが高負荷状態の時はプロセスの再起動に失敗することがあります。
(たとえば service apache2 restart

このようなエラーは制御スクリプト内のstop()に失敗している時に起こります。
(そもそもstop()に失敗しているのにstart()しようとしている

このような事態に陥ってしまった時は、生き残っているプロセスを全てkillしてから
startさせれば大抵解決します。

●まず、生き残っているプロセスのIDを調べます。

# ps -ef | grep apache
root 5515 1 0 Jul03 ? 00:00:00 /usr/sbin/apache2
apache 13475 5515 0 04:02 ? 00:00:00 /usr/sbin/apache2
apache 13476 5515 0 04:02 ? 00:00:00 /usr/sbin/apache2
apache 13477 5515 0 04:02 ? 00:00:00 /usr/sbin/apache2
apache 13478 5515 0 04:02 ? 00:00:00 /usr/sbin/apache2
apache 13482 5515 0 04:02 ? 00:00:00 /usr/sbin/apache2
apache 13483 5515 0 04:02 ? 00:00:00 /usr/sbin/apache2
apache 13484 5515 0 04:02 ? 00:00:00 /usr/sbin/apache2
apache 13485 5515 0 04:02 ? 00:00:00 /usr/sbin/apache2

●killコマンドでプロセスを殺します。
(一番小さいプロセスIDをkillすると大抵は全部killできます。

# kill 5515

●もしくはkillallで一気に消すことも可能です。
(LinuxのkillallとSunOSのkillallは意味が違いますので注意してください。

# killall apache2

●生き残っているプロセスを全部殺せたらstartしましょう。

# service apache2 start

これでOK^^

●極稀に、こういう問題も起こるようです
[root@s1 root]# ipcs -s | grep apache
0×00000000 524288 apache 600 1
0×00000000 557057 apache 600 1
0×00000000 589826 apache 600 1
0×00000000 622595 apache 600 1
0×00000000 655364 apache 600 1
0×00000000 688133 apache 600 1

プロセスは死んでるはずなのに、ipcリソースだけ残ってる・・・・・

そういう場合は、 
# ipcrm sem 524288
という感じで残ってるリソースを全部削除してからstartすれば解決するはずです。
一個ずつ消すのがマンドクセという人はipcsの出力結果をawk等で
処理して一気に消せばいいでしょう。

例:
# ipcs -s | grep apache | awk '{print $2}' | xargs ipcrm sem