[perl] CGI でサーバーを起動する

 CGI プログラムは要求された HTML 等を出力するために、クライアントに要求された時のみ一時的に起動します。しかし、これでは長時間動かすプログラムを実行することができません。そこで、サーバープログラムを使うと便利です。なら24時間実行し続けるので、定時に実行したい時に便利です。
 しかし、通常サーバープログラムの起動にはシェルアカウントが必要なので、なかなか一般人には手が出せませんでした。そこで、perl CGI から一般のサーバープログラム (デーモンプログラム)を起動できれば、シェルアカウントななくてもサーバープログラムを利用することができます。 ところが、perl の system fork exec のいずれで実行しても、HTTPサーバーのセッションが閉じないため、サーバーが終了するまで、CGI プログラムが止まってしまいます。
 それを解決するには

  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 (0) | trackbacks (0)

Comments

Comment Form

icons:

Trackbacks