CGIでsendmailを使ってメールを送るプログラムを使っているのですが、前は一瞬で終わっていたメール送信が2秒以上かかるほど重くなってしまいました。
サーバーはLINUXを本を見ながらインストールしただけなので、おそらくそっちが原因かと思うのですが、どこをどうなおせば良いのかまったく分かりません。
このままだと壊れてしまいそうな気がしてすごく悩んでます。
よろしくお願いします。
参考になるHPでもいいのですが、英語のページは読めません・・・

このQ&Aに関連する最新のQ&A

A 回答 (1件)

恐らくサーバの負荷が大きいのが原因だと思うのですが、前は一瞬で終わっていた


のが気になります。
linuxはランレベル3で起動してますか?x-windowを起動したりすると処理が重く
なるのは仕方が無いですので、サーバとしては「文字のみ」の画面が好ましいの
ですが。
コマンドライン上から
ps -auwx
もしくは
top
と打ってみて、プロセスの消費量(CPUやメモリの使用率)を見てみてください。
大きなプロセスが溜まっている場合は、当然処理が重くなります。

またCGI自体も、アルゴリズム次第で異常に重くなったりします。
またメールのヘッダや本文に8bitバイナリデータが含まれる場合も重いです。
(これはMIME違反)

多角的に様々な原因が考えられますので、色々な角度から原因を解明していって
みてはいかがですか?

この回答への補足

回答ありがとうございます。
何とか直りましたが、ちょっと補足です。

サーバーとしては文字のみの画面でやっています。
お聞きしたtopなど試してみたのですがサーバーの負荷はあまりないようです。

/usr/lib/sendmail -d0.5 -bp

ってやると、

.
.
.
a.k.a: [192.168.1.2]
.
.
ってのがありました。
このサーバーにはNICが2枚ささっていて[192.168.1.2]は使っていなかったので、linuxconfで消したら直りました。

これで、原因は解決したのですよね?

それと、
/var/spool/mqueue (20 requests)
ってでていました。本を見てると、でてたらダメみたいな事が書いてあったような気がするのですが、問題ありでしょうか?

よろしくお願いします。

補足日時:2001/08/04 12:30
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

QCGIからCGIを、CGI環境変数付きで実行するには?

CGI(Perl)からCGI(Perl)を実行してその出力を得るには
どうしたら良いでしょうか。

そのCGIがもっている環境変数(IPアドレスとか、POSTデータ)も
渡したいのですが・・・。

Openでパイプを使ってやればいいとまではわかり、
環境変数などを渡さないで純粋にCGIを実行させて
その出力を受け取るところまでは出来ました。

Aベストアンサー

Openでパイプを使って起動した子プロセスには、環境変数は全てコピーされるはずです。 どの変数が消えたり変ったりしてますか?


> 環境変数(IPアドレスとか、POSTデータ)

CGIパラメーターが環境変数として渡されるのは GETメソッドの場合です。 (GETメソッドの場合、URL上でも xxxx?a=1&b=2 の様にパラメーターを表現できます)

POSTメソッドの CGIパラメーターは、STDIN から入力します。 だから、これを子プロセスに引き継ぐには、それなりの工夫が必要です。

工夫というと、例えば以下のいずれかです。

・ 親が STDIN を読む前に子プロセスを起動する。

・ 親は入力した STDIN を記憶しておき、子プロセスの起動後に記憶内容をパイプで渡す。 子プロセスの STDOUT を親がパイプで読みたいなら、さらに面倒。 (パイプ指定の open() だけでは STDIN/STDOUT 両方のパイプは多分不可)

いずれの場合も、CGI.pm なんかを親が使うとまずいかも知れません。

Openでパイプを使って起動した子プロセスには、環境変数は全てコピーされるはずです。 どの変数が消えたり変ったりしてますか?


> 環境変数(IPアドレスとか、POSTデータ)

CGIパラメーターが環境変数として渡されるのは GETメソッドの場合です。 (GETメソッドの場合、URL上でも xxxx?a=1&b=2 の様にパラメーターを表現できます)

POSTメソッドの CGIパラメーターは、STDIN から入力します。 だから、これを子プロセスに引き継ぐには、それなりの工夫が必要です。

工夫というと、例えば以下のいずれかで...続きを読む

QsendmailのFROMに日本語を使う

CGIからsedmailを呼び出してメールを送信しています。
その時に差出人の部分の日本語が文字化けしてしまいます。
そこで&jcode'convertでjisに変えたのですが、今度は
CGIがサーバーエラーになってしまいます。
どうすればよいでしょうか。

スクリプトはこんな感じです。
-----------------------------------------------
$from = '両国';
$subject = 'テスト';

&jcode'convert(*from, 'jis');
&jcode'convert(*subject, 'jis');
&jcode'convert(*msg, 'jis');

$errno = 1 unless open(MAIL, "| /usr/lib/sendmail -t");
return 0 if $errno;

print MAIL "To: $MailTo\n";
print MAIL "From: $from\n";
print MAIL "Subject: $subject\n";
print MAIL "Content-Type: text/plain;\n\n";
print MAIL "$msg\n";
$errno = 2 unless close(MAIL);
return 0 if $errno;

CGIからsedmailを呼び出してメールを送信しています。
その時に差出人の部分の日本語が文字化けしてしまいます。
そこで&jcode'convertでjisに変えたのですが、今度は
CGIがサーバーエラーになってしまいます。
どうすればよいでしょうか。

スクリプトはこんな感じです。
-----------------------------------------------
$from = '両国';
$subject = 'テスト';

&jcode'convert(*from, 'jis');
&jcode'convert(*subject, 'jis');
&jcode'convert(*msg, 'jis');

$errno = 1 unless open...続きを読む

Aベストアンサー

解決できるような回答ではありませんが.

メールのヘッダに日本語を書くことは、基本的には
できません.
JISコードに変換後、、MIME(Base64)でエンコードして
から送付しないとダメです.(RFC2045,RFC2047)

jcode.pl でなく、jcode.pm には、
MIMEエンコードの機能が付いています.
http://openlab.ring.gr.jp/Jcode/index-j.html

他にも、MIME 関係のモジュールを利用する手もあります.
(MIME::Base64 など)

参考URL:http://www.din.or.jp/~ohzaki/perl.htm#JP_Base64

Qa.cgi経由で、b.cgi実行

a.cgiからLOCATIONで、b.cgiを実行したいのですが、
1つ条件がありまして、b.cgiを実行する場合は必ず
a.cgi経由出なければいけないというチェックをしたいのです。

LOCATIONを使用した場合、環境変数「HTTP_REFERER」に値がセットされないみたいなのでNGでした。

またパラメータを持たせるにしても、LOCATIONはGETしか使えないので、アドレスを見ればばればれになってしまいNGです。

何かいい方法はないでしょうか?
よろしくお願いします。

Aベストアンサー

セッション管理というやつですね。

a.cgi
セッションIDを生成(ランダムに)。
生成したID(+作成日時とか)をファイルに保存
b.cgiに遷移 Location b.cgi?セッションID

b.cgi でセッションIDが正しい(存在する)かチェックします。

→参考URL
http://www.atmarkit.co.jp/fsecurity/rensai/webhole03/webhole01.html
http://www.dab.hi-ho.ne.jp/sasa/biboroku/perl/session.html

参考URL:http://www.atmarkit.co.jp/fsecurity/rensai/webhole03/webhole01.html

Qa.cgi → b.cgiへデータの受渡し方法

a.cgi → b.cgiへデータの受渡しを行いたいのですが

i-modeのHPで,画面入力させた内容を
a.cgi → b.cgiに受け渡す方法を教えて下さい。

例?:a.cgiに下記のコーディングでは無理ですよね・・・
$aa=$FORM{'aa'};
print "Location: http:・・・・・i/b.cgi?a=$aa\n\n";

Aベストアンサー

こんにちは。

Locationで引数をつけて渡すことは可能です。
なので、例にかかれている書式でも大丈夫です。
実際にそうやって飛ばしています。

ただ、引数の中身が日本語の場合は飛ばす前にエンコードしてやる必要があるかも。

Qcgiから別のcgiをコールする方法を教えてください。

いつもお世話になります。
プログラムとプログラムを結合しております。最初はサブルーチン化しようと思いましたが、元のプログラムの解析ができず。プログラムのコールしたいと考えております。perlから別のperlで作成したcgiをコールする記述方法を教えてください。初歩的な質問で申し訳ありません。

Aベストアンサー

その呼び出すcgi が実行できてその標準出力を取り込むということだったら
$result=`other.cgi`;
(`は、バッククォート)
でできると思う。


おすすめ情報