• ベストアンサー

デーモンプロセスの起動について

こんにちは。初心者で大変申し訳ないのですが、 調べてもどうしても分からなかった為、質問させて 頂きました。お手数をおかけしますがご教授頂ければ幸いです。 perlで作成したデーモンプロセスの起動方法なのですが、私のような初心者の考えだと「ブラウザからリクエストして起動する」とか「sshで入って起動する」といった方法しか思いつかないのですが、それだとデーモンの場合、ブラウザを閉じたタイミングやSSHを遮断したタイミングでプログラムが終了してしまい、どうしていいのか分からず困っております。 例えば while(1) { print "a\n"; sleep(10); } といった単純な無限ループスクリプトをデーモン状態に持続的に動作させたい場合、どのような方法で行うべきなのでしょうか? 初心者で申し訳ございません。宜しくお願い致します。 サーバー:レンタルサーバー(RedHatLinux8.0) root権限なし,デーモンOK

  • Perl
  • 回答数3
  • ありがとう数9

質問者が選んだベストアンサー

  • ベストアンサー
  • you-m
  • ベストアンサー率58% (190/327)
回答No.3

まず、デーモンとはいかなるものなのかという所が分かっていた方がいいでしょう。 かなり昔に、私が回答したものがありますので、参考にしてください。 http://okweb.jp/kotaeru.php3?q=230337 実際、PerlやRubyであれば、きちんとしたデーモンプロセスを作成するのは、そう難しい話ではありません。 これがシェルスクリプトだとやや面倒になりますけどね。 &をつけて実行するやり方は、UNIX一般的には、単純にその端末上でのバックグラウンドになるだけで、デーモン化するわけではありません。環境にもよるかもしれませんが、基本的にはログアウトした時に終了してしまいます。 ただし、Linuxの標準シェルであるbashの場合、&するだけで制御端末も切り離してしまうようです。この仕様はUNIX全般で通用しないものとして考える方がよいと思います。 以下は、UNIX全般のお約束として読んで下さい。 forkしてデーモン化するやり方がどうしても理解できない場合は、とにかく永久ループするプログラムを作成して、起動用のシェルスクリプトを用意し、その中から&起動するという方法があります。 シェルスクリプトのデーモン化でよくやる手ですが、きちんとしてデーモンプロセスにはならないものの、制御端末からは切り離せるので、ログアウトしても動きつづけます。 ただし、いずれの方法にしても、こういったプログラムを動かす際には、サーバを停止せずに終了させる方法も、同時に考えておくべきです。 気軽にサーバごとシャットダウンできるのであれば、さしたる問題ではないかもしれませんが、そうでない場合、都度プロセスIDを調べてkillするのは、面倒な上にリスクを伴います。 一般的には、起動したシェルスクリプト、もしくはプログラム本体が決められたファイルにPIDを出力しておき、終了用のシェルスクリプト(普通は起動と終了を行う一つのスクリプトになります)は、そこに書かれているPIDに対してkillします。 プログラム本体は、シグナルをトラップしており、killで送られたSIGTERM等をトリガーとして、自分自身を正しく終了させる処理を行います。 と、一応これくらいの事をしておくことが、デーモン(もしくはデーモンのように動くプログラム)を動かす上での注意点となるでしょうか。 プログラムの作り方によっては、少しづつメモリを食いつぶしてしまうような事もままあり、常駐して動きつづけるプログラムは、少々慎重に作る必要があるでしょう。 以上 ご参考までに。

chanter
質問者

お礼

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

その他の回答 (2)

  • leaz024
  • ベストアンサー率75% (398/526)
回答No.2
参考URL:
http://www.kt.rim.or.jp/~kbk/perl5.005/perlipc.html#Complete_Dissociation_of_Child_f, http://iis1.cps.unizar.es/Oreilly/
chanter
質問者

お礼

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

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

私が、勘違いしているかもしれませんが コマンド & でバックグラウンドジョブにすれば、 接続が切れても、OSがこけない限り起動していると思います。(ただし、print先はNULLデバイスになると思いますが)

chanter
質問者

お礼

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

関連するQ&A

  • 無限ループについて(while true~)

    たびたびお世話になります。 管理しているサーバーとデータベースの接続確認を、30分に一度行っているのですが、この際に入力していたコマンドが無限ループから抜け出すことができなくなってしまいました。 入力していたコマンドは、while true; do ./aaa.sh ; sleep 1800; doneです。 30分に一度、aaa.shを起動させて接続を確認する、というつもりで入力していたものなのですが…。 無限ループに気付き、プロセスをrootからkill(-kill) しても復活(?)してしまうようです。 このままでは問題があるため、なんとか無限ループを抜け出したいのですが、いい方法はありませんでしょうか? OSはLinuxです。 申し訳ありませんが、初心者中の初心者のため、必要な情報があまりわかりません。不足がありましたら、補足要求お願いします。

  • httpdが起動できない。

    初心者ですが現在サーバーの設定中です。 OSはCentOS4です。 いじっているマシンはもともとサーバーとしては動いていたのですが、PHPが使えないので、Apache2.4.4とPHP5.3.22をインストールしました。 結果、httpdのデーモンを起動する際、何もエラーが出ず [OK] と表示されるのですが、状態はstoppedのままになっています。 /var/log/httpd/error_logを見ても起動した形跡はありませんでした。 他にも私が見ている範囲ではエラーはありません。 もともとあったhttpdのデーモン起動ファイルも残してあるのですが、そちらでは正常に起動、停止でき、logにも残ります。こちらでデーモンを起動してもPHPは使えません。 何かお気づきの点がありましたらご指導お願いします。

  • プロセス監視の方法

    どのたかよい方法をご存知の方いらっしゃいましたら、 助力お願いします。 .NETのアプリケーションで、ある特定のプロセスが起動した時に 処理を実行するアプリを作りたいと思っています。 この場合のあるプロセスとは、Notepadとか、Wordとかです。 無限ループで、プロセスを監視しようと思ったのですが、 メモリの消費が多く重たいので、何かよい方法はないでしょうか? 例えば、ある特定のプロセスが起動したら、 それがトリガーとなるような仕組みとか、可能でしょうか? よろしくお願いします。

  • httpd(apache)が起動しない

    RedHatLinux8.0を用いてサーバーを立てようとしている初心者です。webサーバーを立てようとして、 httpd-2.0.40-8.i386.rpmを rpm -ihv としてインストールしました。 次に /etc/rc.d/init.d/httpd start としたのですが、 httpdを起動中: httpd: Could not determine the server's fully qualified domain name, using 127.0.0.1 for ServerName [失敗] と言われて起動ができません。ネット上で見ると、同じエラーが出ていても起動ができている方もおられるようで、よく わかりません。どうしたら起動できるのでしょうか。 初歩的な質問で申し訳ありません。 よろしくおねがいします。

  • ブラウザ閉じたらサーバー処理はどうなる?

    ふと気に合ったのですが、例えばブラウザのボタンを押して無限ループをサーバーで起こさせ、その処理中にブラウザを閉じた場合、サーバーで行われている処理はどうなるのでしょうか? ブラウザが閉じられた場合、「もうその処理はいいよ~」みたいなリクエストがサーバーに送られたりしてストップするのでしょうか? 以上、よろしくお願いします。

    • ベストアンサー
    • AJAX
  • Javaプログラム同士のプロセス間通信について

    Java初心者です。 デーモン化したJavaプログラムとJavaサーブレット間のプロセス間通信を 行いたいと思っていますがどのようにしたものか悩み中です。 ○デーモン化したJavaプログラムは、 1、あるポートからSocket通信でデータを受信し、受信したデータをDBに格納する 2、クライアントからの要求で1で保存したデータを加工して送信 ○サーブレットプログラムでは、 上記のデーモン化プログラムの設定等をブラウザ上から変更できるようにしたいと考えています。 設定とは、例えば受信したデータを全てDBに保存せずに ブラウザから条件を設定できてフィルターするような動作に変更できたり、 また、デーモン化プログラムの動作をブラウザ上から停止、開始できるようにしたいのです。 上記の様な構成の場合にプロセス間通信をする必要があると思いますが、 どの様なプロセス間通信を使えばいいのか悩んでいます。 ほんとうは上記の様な2つのプログラムを1つのプログラムで出来ればいいなぁ~と考えているのですが、、 実現方法が判りません。。 なにか名案はございませんでしょうか? わかりづらい説明でもうしわけございません。 参考になるかわかりませんが、イメージ図を、 <イメージ図> デ  data   開  data    ク ー --------> 発 -------->  ラ タ        中         イ 鯖        鯖         アント          ↑          |          |設定変更          |       管          └--------- 理                   者 よろしくおねがいします。

    • ベストアンサー
    • Java
  • 起動しない・・

    パソコン初心者です。windows xpが起動しなくなりました。電源を入れるとセーフモード3種、通常起動、前回の正しい設定での起動の選択画面が出て、どれを選択してもXPの画面が一度出てすぐ再起動してまた元の同じ画面に戻ってしまいます(無限ループ)。前にも一度なったのですが、その時は何回か(何かを)やったら起動できてデスクトップ表示まで行きましたが、今回は戻らなくて困っています。xpのCDの修復ファイル?で、もしかしたら出来ると聞いたのですが、自分の手元にあるのは microsoft Office Personal edition 2003です。これで出来るのでしょうか?この場合データをすべて消去する再セットアップでしか方法はないのでしょうか?他に方法があれば教えて頂きたいです。またデータをバックアップする方法もあれば宜しくお願いいたします。

  • デーモンとしてサーバプログラム(ソケット使用)を稼動させるには?

    質問はタイトルの通りなのですが、いま私は、ソケットを用いてサーバプログラムを作成しております。私の作ろうと思っているプログラムは、forkを用いて、親プロセスにクライアントからの接続を待たせ、接続があったら、子プロセスに処理を行わせ、親プロセスは接続待ち(accept)に戻ります。あとは、この処理をひたすらループさせるだけです。  ですが、どのタイミングでforkやら無限ループを入れればよいのか分かりかねます。  ネットで色々調べていたら以下のサイトを発見し、それっぽいプログラムのサンプルが載っていたのですが、雰囲気的には、こんな感じでよろしいのでしょうか? http://kansai.anesth.or.jp/gijutu/perl/man-socket.php#tcp-msrv です。  どなたかご教授して頂けると幸いです。よろしくお願いします。

    • ベストアンサー
    • Perl
  • 動画を再生すると固まってしまう

    起因は不明ですが、突然動画を再生すると10秒ぐらいは正常に再生してくれるのですが、その後―キズ入りのCDのように―同じ部分を繰り返し再生する無限ループに陥るようになってしまいました。 そのとき使っていたソフトは「media player classic」ですが、その後WMPでも同様の状況となりました。 また、無限ループ状態となった時に一種のフリーズ状態になります。具体的には、まずその動画再生ソフトは操作を受け付けません。(しかし無限ループで再生しています)しかしマウス操作は生きており、例えばバックグラウンドにブラウザがある場合、通常通り操作できます。 しかし、このブラウザなどのタスクの「閉じる」をクリックすると同様に操作を受け付けなくなり、最終的にマウスのみ動かせて他はなにもできなくなります。 タスクマネージャ起動、ウインドウズボタンなどキーボードで動かせそうなこともできません。よって終了すら出来なくなります。(仕方なくコンセントを抜いていますが他に方法があるでしょうか・・・) コンセントを抜いて再起動すると問題なく起動し、この通りブラウザなどは使えます。動画を再生しようとすると以上の通りとなり、最終的にコンセントを抜いています・・・。これが更なるトラブルを生みそうで怖いです・・・。 長文で申し訳ありませんが、起因が判りませんので全て書き連ねると長文となってしまいました。 回答者様からのご質問も承ります。よろしくお願いいたします。

  • 対象のアプリケーションが終了するまで起動し続ける

    C言語でメモ帳を起動している間だけ作ったプログラムが起動し続け メモ帳が終了したらプログラムも終了する方法がありますでしょうか? メモ帳が起動しているときは「起動しています」と無限ループで出て メモ帳を終了したときは1回だけ「終了しました」と出るようにしたいです。