[perl] CGI でサーバーを起動する
CGI プログラムは要求された HTML 等を出力するために、クライアントに要求された時のみ一時的に起動します。しかし、これでは長時間動かすプログラムを実行することができません。そこで、サーバープログラムを使うと便利です。なら24時間実行し続けるので、定時に実行したい時に便利です。
しかし、通常サーバープログラムの起動にはシェルアカウントが必要なので、なかなか一般人には手が出せませんでした。そこで、perl CGI から一般のサーバープログラム (デーモンプログラム)を起動できれば、シェルアカウントななくてもサーバープログラムを利用することができます。 ところが、perl の
しかし、通常サーバープログラムの起動にはシェルアカウントが必要なので、なかなか一般人には手が出せませんでした。そこで、perl CGI から一般のサーバープログラム (デーモンプログラム)を起動できれば、シェルアカウントななくてもサーバープログラムを利用することができます。 ところが、perl の
system fork exec のいずれで実行しても、HTTPサーバーのセッションが閉じないため、サーバーが終了するまで、CGI プログラムが止まってしまいます。 それを解決するには
と書くとうまくいきました。これは同様の C プログラムを perl で再現したものです。しかし、perl の内部処理に詳しくないので、これで完璧かどうかはわかりません。でも、今のところ問題は起きていません。何か気がついた点がありましたら、コメントお願いします。
if(($pid = fork()) == 0){
#>>>子プロセス
# 呼び出しプロセスの端末を切り離す
setsid();
# 標準入力、標準出力、標準エラー出力カット
close(STDIN);
close(STDOUT);
close(STDERR);
#/dev/nullで埋める
open(STDIN, "/dev/null");
open(STDOUT, ">/dev/null");
open(STDERR, ">/dev/null");
#サーバー起動
exec("echo_server");
}
#フォークエラー
if($pid < 0){
die("fork error");
}
と書くとうまくいきました。これは同様の C プログラムを perl で再現したものです。しかし、perl の内部処理に詳しくないので、これで完璧かどうかはわかりません。でも、今のところ問題は起きていません。何か気がついた点がありましたら、コメントお願いします。
Comments