お世話になっております。
あるサイトで見たforkの例を元に下記のようなソースでバックグラウンドで処理
しようとしているんですが、処理が終わるまでブラウザがロックされて
しまします。
$| = 1;
rm("-f","$TmpPath$KYOTEN/result/*.*");
&Upload_Check;
print "Content-type: text/html\n\n";
&DataProgHeader_Write; #画面の切替
&DataProgDetail_Write;
FORK: {
if( $pid = fork ) {
close(STDOUT);
wait;
} elsif (defined $pid) {
close(STDOUT);
chdir "/u1/uca/htdocs/PPro";
system("perl U0302.pl $Dkyoten");
exit;
} elsif ( $! =~ /No more process/) {
sleep 5;
redo FORK;
} else {
&MsgDisp("Forkできませんでした。");
}
} # End Of Label:FORK
バックグラウンドで動かない理由が分からないのです。
どなたかお助けください。
また、ソース中で
system("perl U0302.pl $Dkyoten");
とありますが、サーバで直に動かすと正常に動作するのですが
cgiから呼び出すと文字コードエラーで落ちてしまします。
(呼び出すCGIはEUCで書いていますが、U0302.PLは処理の都合上
SJISで書いています。)
こちらも原因の想定がつきません。
どなたか参考サイトでも構いませんので、お教えください。
お願いいたします。
No.2ベストアンサー
- 回答日時:
にあるように環境によって close(STDOUT)で開放される場合と開放されない場合があるようです。
孫プロセスを生成する方法(fork()2段で親と子を断ち切り、孫の終了はinitに任せる)なら、ゾンビを回避して親プロセスを終了できます。
が、私が使っているレンタルサーバでは、この方法でも無理でした。
取りあえずforkはあきらめた方がよいかもしれませんね。
参考URL:http://oshiete1.goo.ne.jp/kotaeru.php3?q=1733686
ご回答ありがとうございます。
また参考サイト、大変役に立ちました。
fork2段でもダメですか・・・
まあ、待てない時間ではないんです。処理自体は2時間くらいかかる
んですけど、Forkで起動したプロセスは15分くらいで終わるので
15分なら許してくれるかも・・・
色々と試してみます。
でも苦しいみたいですね。
ありごとうございます。
No.1
- 回答日時:
forkした親プロセスがwait、つまり子プロセスの終了を待っていますよね。
従って、これをCGIとして実行した場合には、子プロセスが終了し、その結果として親プロセスが終了するまでは、ブラウザはデータをロード中ということになると思います。waitするのを止めてみると良いかもしれませんね。
ただ、その場合、例えば子プロセスが無限ループに陥った場合などに、HTTPDがそのような暴走した子プロセスを適切に殺してくれるかどうか怪しいですね。生憎私にはそのあたりのことは分かりません。
ご回答ありがとうございます。
このソースの参考になったサイトではwaitしなかった場合、ゾンビプロセスに
なるので・・・と書いていたので、そのままwaitを入れたんですが
これが駄目ですか・・・。
確かに、子の終了を待っている節があったので、今回の質問をさせて
いただいたのですが・・・
waitを取って、子のプロセスが正常終了した場合、子プロセスがゾンビ
プロセスになってしまうことはないのでしょうか?
なければ、子プロセスに関しては試験で異常終了することが無いことは
確認済みなので問題ないと思うのですが、ゾンビになる可能性がある場合は
問題です。
まあ、正常終了することを確認と言っても何が起こるのわかりませんけどね・・・・
明らかに異常終了した場合は、ゾンビになっても手動でプロセスを殺せる
ので問題ないのですが正常終了の場合にゾンビになった場合は、毎回確認が
必要になるので問題です。
何らかの解決策はないでしょうか?
または私のゾンビに関する知識が間違っているのでしょうか?
お手数ですがわかるかたお願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- PHP PostgreSQLからCSV形式でエクスポートする際にカラム内の改行をとる方法 1 2023/02/22 10:05
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- Perl Perlのエラーについてご教授ください。初心者です。 CGIを別サーバに移したところ、Perlのバー 5 2023/05/31 10:48
- PHP PHPでCookieを使った訪問回数について 1 2023/05/28 14:10
- C言語・C++・C# プログラミングの問題です。至急教えてください。 /***から***/の部分をプログラミングにしてほし 1 2022/10/13 11:48
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- CGI CGIで出力するhtmlの<!DOCTYPE html>等のタグは要りますか? 2 2023/02/05 21:26
- その他(プログラミング・Web制作) cryptcatのビルド 4 2022/07/21 14:55
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
AIX6でファイルのタイムスタン...
-
ハマったので助けて~。Apache...
-
ArduinoのジャイロモジュールMP...
-
例外処理のフローチャートの記...
-
Excel VBAでリンク切れをチェッ...
-
エクセルVBAでシートモジュール...
-
Excel VBA 『Call』で呼び出す...
-
ユーザー定義関数に#NAME?が返...
-
大量の標準モジュールを解放す...
-
VBAで別モジュールへの変数の受...
-
モジュールの最大数はいくつな...
-
標準モジュールを削除したい。(...
-
Excel VBA 定義されたプロージ...
-
LCD ディスプレイを Raspberry ...
-
MS-Access と接続する方法を教...
-
VBSがコンパイルエラーになりま...
-
ActivePerl付属のPPMでモジュー...
-
Excel VBAで、ユーザーフォーム...
-
VBAで「メモリが不足しています」
-
VHDLにおける「generic」について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
AIX6でファイルのタイムスタン...
-
時間がかかり過ぎたプロセスを...
-
open MAILでの"|"
-
Active Directoryでグループに...
-
LinuxにおいてのPerlのプログラ...
-
Perlでpopen()的なものを使って...
-
forkで作れる子プロセス数が限...
-
HELOコマンドが失敗する。
-
gem install houston
-
system関数とqx演算子の違いに...
-
Perlの処理待ちコマンド
-
perlスクリプト内でシェルコマ...
-
ディスク容量について
-
実行中のcpan processを終了さ...
-
Perlで特定のコマンドを実行さ...
-
例外処理のフローチャートの記...
-
Excel VBAでリンク切れをチェッ...
-
ユーザー定義関数に#NAME?が返...
-
VBAで別モジュールへの変数の受...
-
"JScript"が見つかりません!
おすすめ情報