みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

さくらインターネットのレンタルサーバーのOSはFreeBSDですが、

さくらインターネットのレンタルサーバーのOSはFreeBSDですが、
たとえば、自サイトのCGIの負荷が高くなるとホームページが開かなくなります。
個人のページなので、強制的にプロセスを削除するスクリプトをperlやシェルスクリプトで書きたいのですが、どのように書けばよいでしょうか?
topとすると、

PID USERNAME THR PRI NICE SIZE RES STATE C TIME WCPU COMMAND
23981 test 1 4 0 16180K 13144K select 0 0:00 0.00% perl5.8.

これをスクリプトで削除する方法です。
人間が見ればCOMMANDがperl5.8.となっているので、これがcgiでPIDは23981なので
kill -9 23981とすればよいのはわかりますが、
スクリプトで実行する方法が知りたいです。

投稿日時 - 2010-07-27 16:21:09

QNo.6068176

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

23人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

> 人間が見ればCOMMANDがperl5.8.となっているので、これがcgiでPIDは23981なので
> kill -9 23981とすればよいのはわかりますが、

どうしようもない異常な状態で行うなら仕方ありませんが、そうでないのに kill -9(kill -KILL)は避けた方が良いです。
ゾンビになっても適当に再起動できるコンピュータなら良いですが。

CGIプログラムに非同期終了させる機能を入れてはいかがでしょうか。

例えば、SIGUSR1が送られたら、exit終了する様なシグナル処理を入れておけば、kill -USR1 23981で終了させる事ができます。


> スクリプトで実行する方法が知りたいです。

シェルスクリプトでしょうか、perlスクリプトでしょうか。

使いたいスクリプティング言語の種類が分からないのでなんとも答えにくいですが、大抵の言語に機能は備わっているはずですよ。

シェルスクリプトならkillコマンドを使えば良いでしょうし、perlやC言語などならkill関数を使う事やsystem関数などのコマンドを実行できる関数や機能を使ってkillコマンドを実行するなどの方法で実現できるかと思います。



強制的なプロセスのシグナル停止ではない方法も平行してお調べになってはいかがでしょうか。
ウェブサーバの設定(プロセス数などのリソース調整)で行えた方が良さそうな感じの問題に見えますので。
http://www.drk7.jp/MT/archives/001594.html
※ 高負荷になりすぎないように、起動するCGIプロセス数を制限してしまうのも一手法です。無理にKILLすれば、利用者が送信したデータが消えてしまったりもしますから。(シグナル処理で終了すれば、データを処理してから終了するようにプログラムを書く事もできますが)

投稿日時 - 2010-11-14 12:34:12

ANo.1

どこかに pid を記録するように cgi を改造したらどう?

投稿日時 - 2010-07-29 11:13:20

あなたにオススメの質問