[トラブルシューティング]大量のゾンビプロセス(zombie)が発生
4377 ワード
環境:SUSE Linux Enterprise Server 11 SP 2
1つのsuseシステムを検出したzombieは100以上のログインサーバ検出に達した
まず、クエリがどのプロセスによって引き起こされたかを調べます.
注意:これは私が後で障害を再現したデータです.
しかし、このスクリプトは問題なく、誰も変更したことがなく、以前は正常に動作していました.
このスクリプトの親プロセスがどのプログラムなのか見てみましょう
これらのプロセスの親プロセスはcron、すなわちタイミングタスクプログラムcrontabであることがわかります.
このユーザーにアクセスしてみてください
ヒントが/var/spool/cronというディレクトリに入る権限がないことを発見しました
このプログラムの権限をもう一度見てみましょう.
もともとsビットが少なくなったsビットは一般ユーザーに一時的に権利を与える役割に相当するcrontabが少なくなったsビットが少なくなったら実行できない
sビットを加える
元のゾンビプロセスをすべて殺す注意:父プロセスを殺すには、サブプロセスは殺すことができません
この問題の解決に成功したと思っていた.
しかし、観察してみると、ゾンビのプロセスはまだ発生しています.履歴を調べてみると、chmod 775/usr-Rを前日に実行した人がいて、/usrディレクトリの下にあるsビット付きのプログラムをすべて消去したことがわかります.
他のプログラムが影響を受けてcrontabの異常な動作を引き起こしたようです.
crontabが他のプロセスを呼び出すかどうかを確認します.
元crondはスクリプトを実行するときにsendmailを呼び出してスクリプト出力情報をcrondユーザーにメールで送信します.
sendmailのプロセス数を見てみるとやはりたくさんあります
しかし、他のシステムではsendmailはsビットを持っていないが、pstreeではpostdropを呼び出してメールを処理し、他のシステムではpostdropを見て、sビットを持っている.前にchmod 755/usr-Rを実行してこのプログラムのsビットも削除し、cron権限の問題を引き起こし、プロセスがゾンビプロセスになったからだ.このプログラムにsビットを追加します.
観察してみると、ゾンビの進行は二度と現れなかった.
/etc/crontabのMAILTOを「」に設定すると、crontabはログを送信しなくなります.
ゾンビプロセスのトラブルシューティングによく使用されるコマンド:ps-ef|grep defu strace(スクリプトに遭遇してゾンビプロセスを生成し、このコマンドによって追跡して解決する、非常に有用なコマンド)lsof ldd pstree
1つのsuseシステムを検出したzombieは100以上のログインサーバ検出に達した
まず、クエリがどのプロセスによって引き起こされたかを調べます.
ps -ef|grep defu
sfhadm 7444 7443 0 02:10 ? 00:00:00 [test.sh] <defunct>
sfhadm 7463 7462 0 02:12 ? 00:00:00 [test.sh] <defunct>
sfhadm 7481 7480 0 02:14 ? 00:00:00 [test.sh] <defunct>
注意:これは私が後で障害を再現したデータです.
しかし、このスクリプトは問題なく、誰も変更したことがなく、以前は正常に動作していました.
このスクリプトの親プロセスがどのプログラムなのか見てみましょう
linux-dkcm:~ # ps -ef|grep 7443
root 7443 3282 0 01:12 ? 00:00:00 /usr/sbin/cron
これらのプロセスの親プロセスはcron、すなわちタイミングタスクプログラムcrontabであることがわかります.
このユーザーにアクセスしてみてください
$crontab -l
cannot chdir(/var/spool/cron), bailing out.
/var/spool/cron: Permission denied
ヒントが/var/spool/cronというディレクトリに入る権限がないことを発見しました
このプログラムの権限をもう一度見てみましょう.
ls -la /usr/bin/crontab
-rwxr-xr-x 1 root trusted 40432 Jan 24 2012 /usr/bin/crontab
もともとsビットが少なくなったsビットは一般ユーザーに一時的に権利を与える役割に相当するcrontabが少なくなったsビットが少なくなったら実行できない
sビットを加える
chmod 6755 /usr/bin/crontab
元のゾンビプロセスをすべて殺す注意:父プロセスを殺すには、サブプロセスは殺すことができません
ps -ef|grep defunct|grep -v grep|awk '{print $3}'|xargs kill -9
この問題の解決に成功したと思っていた.
しかし、観察してみると、ゾンビのプロセスはまだ発生しています.履歴を調べてみると、chmod 775/usr-Rを前日に実行した人がいて、/usrディレクトリの下にあるsビット付きのプログラムをすべて消去したことがわかります.
他のプログラムが影響を受けてcrontabの異常な動作を引き起こしたようです.
crontabが他のプロセスを呼び出すかどうかを確認します.
#pstree
init─┬─acpid
├─auditd─┬─audispd───{audispd}
│ └─{auditd}
├─bonobo-activati───{bonobo-activati}
├─console-kit-dae───63*[{console-kit-dae}] ├─cron───17*[cron─┬─sendmail───postdrop] │ └─test.sh]
元crondはスクリプトを実行するときにsendmailを呼び出してスクリプト出力情報をcrondユーザーにメールで送信します.
sendmailのプロセス数を見てみるとやはりたくさんあります
ps -ef|grep sendmail|wc -l
309
しかし、他のシステムではsendmailはsビットを持っていないが、pstreeではpostdropを呼び出してメールを処理し、他のシステムではpostdropを見て、sビットを持っている.前にchmod 755/usr-Rを実行してこのプログラムのsビットも削除し、cron権限の問題を引き起こし、プロセスがゾンビプロセスになったからだ.このプログラムにsビットを追加します.
chmod 6755 /usr/bin/postdrop
観察してみると、ゾンビの進行は二度と現れなかった.
/etc/crontabのMAILTOを「」に設定すると、crontabはログを送信しなくなります.
ゾンビプロセスのトラブルシューティングによく使用されるコマンド:ps-ef|grep defu strace(スクリプトに遭遇してゾンビプロセスを生成し、このコマンドによって追跡して解決する、非常に有用なコマンド)lsof ldd pstree