電子書籍の厳選無料作品が豊富!

こんにちは。初心者で大変申し訳ないのですが、
調べてもどうしても分からなかった為、質問させて
頂きました。お手数をおかけしますがご教授頂ければ幸いです。

perlで作成したデーモンプロセスの起動方法なのですが、私のような初心者の考えだと「ブラウザからリクエストして起動する」とか「sshで入って起動する」といった方法しか思いつかないのですが、それだとデーモンの場合、ブラウザを閉じたタイミングやSSHを遮断したタイミングでプログラムが終了してしまい、どうしていいのか分からず困っております。

例えば
while(1)
{
print "a\n";
sleep(10);
}

といった単純な無限ループスクリプトをデーモン状態に持続的に動作させたい場合、どのような方法で行うべきなのでしょうか?
初心者で申し訳ございません。宜しくお願い致します。

サーバー:レンタルサーバー(RedHatLinux8.0)
root権限なし,デーモンOK

A 回答 (3件)

まず、デーモンとはいかなるものなのかという所が分かっていた方がいいでしょう。



かなり昔に、私が回答したものがありますので、参考にしてください。
http://okweb.jp/kotaeru.php3?q=230337

実際、PerlやRubyであれば、きちんとしたデーモンプロセスを作成するのは、そう難しい話ではありません。
これがシェルスクリプトだとやや面倒になりますけどね。
&をつけて実行するやり方は、UNIX一般的には、単純にその端末上でのバックグラウンドになるだけで、デーモン化するわけではありません。環境にもよるかもしれませんが、基本的にはログアウトした時に終了してしまいます。
ただし、Linuxの標準シェルであるbashの場合、&するだけで制御端末も切り離してしまうようです。この仕様はUNIX全般で通用しないものとして考える方がよいと思います。

以下は、UNIX全般のお約束として読んで下さい。

forkしてデーモン化するやり方がどうしても理解できない場合は、とにかく永久ループするプログラムを作成して、起動用のシェルスクリプトを用意し、その中から&起動するという方法があります。
シェルスクリプトのデーモン化でよくやる手ですが、きちんとしてデーモンプロセスにはならないものの、制御端末からは切り離せるので、ログアウトしても動きつづけます。

ただし、いずれの方法にしても、こういったプログラムを動かす際には、サーバを停止せずに終了させる方法も、同時に考えておくべきです。

気軽にサーバごとシャットダウンできるのであれば、さしたる問題ではないかもしれませんが、そうでない場合、都度プロセスIDを調べてkillするのは、面倒な上にリスクを伴います。

一般的には、起動したシェルスクリプト、もしくはプログラム本体が決められたファイルにPIDを出力しておき、終了用のシェルスクリプト(普通は起動と終了を行う一つのスクリプトになります)は、そこに書かれているPIDに対してkillします。
プログラム本体は、シグナルをトラップしており、killで送られたSIGTERM等をトリガーとして、自分自身を正しく終了させる処理を行います。

と、一応これくらいの事をしておくことが、デーモン(もしくはデーモンのように動くプログラム)を動かす上での注意点となるでしょうか。

プログラムの作り方によっては、少しづつメモリを食いつぶしてしまうような事もままあり、常駐して動きつづけるプログラムは、少々慎重に作る必要があるでしょう。

以上 ご参考までに。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
大変勉強になりました。
やはり私自身「デーモンとは?」と聞かれても「動き続けるプロセス」くらいにしか答えられなかったのでyou-m様のご回答は大変興味深く、為になるものでした。forkして子としてデーモンを動作させ親は止める、という流れを時間をかけてじっくり理解しようと思いました。シェルスクリプトからバックグラウンドで起動させて制御端末から切り離す方法があるとは知りませんでした。終了方法もひたすらにpidをkillしておりませした(汗) 初めてデーモンプロセスを作る上で重要な事をお教え頂き、大変助かりました。ありがとうございます。

お礼日時:2004/10/29 10:16
    • good
    • 0
この回答へのお礼

お礼:ご回答ありがとうございます!
なるほど。英語はそれほど得意ではないので
間違っている部分もあるかもしれませんが
大まかな意味は解りました。ありがとうございます。

お礼日時:-0001/11/30 00:00

私が、勘違いしているかもしれませんが


コマンド &
でバックグラウンドジョブにすれば、
接続が切れても、OSがこけない限り起動していると思います。(ただし、print先はNULLデバイスになると思いますが)
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
なるほど!バックグラウンドジョブとして
動作させる方法もあるのですね。
とても助かりました。ありがとうございました!

お礼日時:2004/10/28 16:13

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