- PR -

CGIからシェルを非同期で起動する方法

1
投稿者投稿内容
oki
ベテラン
会議室デビュー日: 2004/12/18
投稿数: 55
投稿日時: 2005-08-09 15:23
お世話になります。

cgi(perl)からシェルを非同期で起動しておき
すぐに別のページにリダイレクトしたいのですが
シェルの終了を待っているようで、すぐにリダイレクトできません。

直接、perlコマンドで下記のtest.cgiを起動すると
シェルは非同期で起動されるのですが...

ご教授お願いできれば幸いです。

test.cgi
-------------------------------------------
#!/usr/bin/perl --

# リダイレクト
print "Location: test2.cgi\n\n";

# シェルを非同期で起動
exec "/usr/bin/sudo /usr/local/bin/test.sh &"

exit(0);
-------------------------------------------
Apache 2.0.40
Perl 5.8.0-88
cn009
ベテラン
会議室デビュー日: 2004/05/13
投稿数: 72
投稿日時: 2005-08-09 16:02
単にexec()しただけでは、標準出力がApacheに繋がったままになり、
ApacheがCGIスクリプト(とその子プロセス)の出力が終わるのを待っているのではないでしょうか?

fork()して子プロセスでSTDOUT、STDERRを閉じてからexec()したら大丈夫だったと思います。

angel
ぬし
会議室デビュー日: 2005/03/17
投稿数: 711
投稿日時: 2005-08-09 17:57
こんにちは。
cn009 さんのコメントにもありますが、子プロセスが CGIプロセスの STDOUT, STDERR を継承したままだと、CGI自体の出力が完了していないと見なされます。

 exec '/usr/bin/sudo /usr/local/bin/test.sh >/dev/null 2>&1 &'

等のように、STDOUT, STDERR を別口へ切り替える手が使えると思います。
※ STDIN は…、今回関係無いかな??
1

スキルアップ/キャリアアップ(JOB@IT)