
こんにちは。初心者で大変申し訳ないのですが、
調べてもどうしても分からなかった為、質問させて
頂きました。お手数をおかけしますがご教授頂ければ幸いです。
perlで作成したデーモンプロセスの起動方法なのですが、私のような初心者の考えだと「ブラウザからリクエストして起動する」とか「sshで入って起動する」といった方法しか思いつかないのですが、それだとデーモンの場合、ブラウザを閉じたタイミングやSSHを遮断したタイミングでプログラムが終了してしまい、どうしていいのか分からず困っております。
例えば
while(1)
{
print "a\n";
sleep(10);
}
といった単純な無限ループスクリプトをデーモン状態に持続的に動作させたい場合、どのような方法で行うべきなのでしょうか?
初心者で申し訳ございません。宜しくお願い致します。
サーバー:レンタルサーバー(RedHatLinux8.0)
root権限なし,デーモンOK
No.3ベストアンサー
- 回答日時:
まず、デーモンとはいかなるものなのかという所が分かっていた方がいいでしょう。
かなり昔に、私が回答したものがありますので、参考にしてください。
http://okweb.jp/kotaeru.php3?q=230337
実際、PerlやRubyであれば、きちんとしたデーモンプロセスを作成するのは、そう難しい話ではありません。
これがシェルスクリプトだとやや面倒になりますけどね。
&をつけて実行するやり方は、UNIX一般的には、単純にその端末上でのバックグラウンドになるだけで、デーモン化するわけではありません。環境にもよるかもしれませんが、基本的にはログアウトした時に終了してしまいます。
ただし、Linuxの標準シェルであるbashの場合、&するだけで制御端末も切り離してしまうようです。この仕様はUNIX全般で通用しないものとして考える方がよいと思います。
以下は、UNIX全般のお約束として読んで下さい。
forkしてデーモン化するやり方がどうしても理解できない場合は、とにかく永久ループするプログラムを作成して、起動用のシェルスクリプトを用意し、その中から&起動するという方法があります。
シェルスクリプトのデーモン化でよくやる手ですが、きちんとしてデーモンプロセスにはならないものの、制御端末からは切り離せるので、ログアウトしても動きつづけます。
ただし、いずれの方法にしても、こういったプログラムを動かす際には、サーバを停止せずに終了させる方法も、同時に考えておくべきです。
気軽にサーバごとシャットダウンできるのであれば、さしたる問題ではないかもしれませんが、そうでない場合、都度プロセスIDを調べてkillするのは、面倒な上にリスクを伴います。
一般的には、起動したシェルスクリプト、もしくはプログラム本体が決められたファイルにPIDを出力しておき、終了用のシェルスクリプト(普通は起動と終了を行う一つのスクリプトになります)は、そこに書かれているPIDに対してkillします。
プログラム本体は、シグナルをトラップしており、killで送られたSIGTERM等をトリガーとして、自分自身を正しく終了させる処理を行います。
と、一応これくらいの事をしておくことが、デーモン(もしくはデーモンのように動くプログラム)を動かす上での注意点となるでしょうか。
プログラムの作り方によっては、少しづつメモリを食いつぶしてしまうような事もままあり、常駐して動きつづけるプログラムは、少々慎重に作る必要があるでしょう。
以上 ご参考までに。
ご回答ありがとうございます。
大変勉強になりました。
やはり私自身「デーモンとは?」と聞かれても「動き続けるプロセス」くらいにしか答えられなかったのでyou-m様のご回答は大変興味深く、為になるものでした。forkして子としてデーモンを動作させ親は止める、という流れを時間をかけてじっくり理解しようと思いました。シェルスクリプトからバックグラウンドで起動させて制御端末から切り離す方法があるとは知りませんでした。終了方法もひたすらにpidをkillしておりませした(汗) 初めてデーモンプロセスを作る上で重要な事をお教え頂き、大変助かりました。ありがとうございます。
No.2
- 回答日時:
お礼:ご回答ありがとうございます!
なるほど。英語はそれほど得意ではないので
間違っている部分もあるかもしれませんが
大まかな意味は解りました。ありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Windows 10 windows10のクリーンインストールが完了出来ない 2 2022/06/04 13:33
- その他(プログラミング・Web制作) プログラムの起動、利用について、使用期間を設定する方法 3 2023/08/06 21:03
- WordPress(ワードプレス) WordpressでYouTubeの埋め込みができない。 1 2022/10/26 01:08
- JavaScript [Java] Edgeでのアドレスバー非表示について 3 2022/04/20 17:51
- デスクトップパソコン 「自動修復でPCを修復できませんでした」と表示されPCが起動しないのですが対処法はありますか? 5 2022/05/13 09:16
- 日本株 SBI証券HYPER SBI 2のエラー 1 2023/01/31 13:38
- iOS 警告音? 3 2023/07/13 13:15
- Microsoft ASP C#からvbsを実行したい 5 2022/11/24 17:31
- ノートパソコン Windows 10 動作改善方法 6 2023/04/26 22:30
- デスクトップパソコン windows7を使っているパソコンでの質問です。先日動作が遅く再起動かけると「windowsを起動 9 2022/06/16 21:31
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
OLEサーバコンポーネントを作っ...
-
CreateProcessでコンソールアプ...
-
cygwinパッケージについて
-
Windows10 アップグレード アイ...
-
Photoshop CSをCS3にアップグレ...
-
RedHat5で荐怨
-
TOMCAT起動時エラー
-
uninstallの方法が不明のソフト...
-
KVMでWINDOWSを使用したい
-
インストーラー
-
ブラウザが重いとは、どういう...
-
aptでインストールしたプログラ...
-
Macの手書き漢字入力ツールにつ...
-
タイマーを多用するプログラム...
-
ETI 地球外知的生命体探査プロ...
-
linux勉強中の質問です。
-
Solaris からリモートでWindows...
-
CentOSで操作ログを取得するコ...
-
centosにrun拡張子ソフトのイン...
-
DirectXについて・・・よろしく...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バッチスクリプト処理でエラー...
-
VBでExcelが起動されているか知...
-
バッチファイルで多重起動を防ぐ
-
VB6 二重起動確実防止について
-
Linux環境変数設定(putenv?se...
-
Open Office Org 急に起動しな...
-
デーモンプロセスの起動について
-
コンソールアプリの起動結果待...
-
system関数について
-
ロリポップサーバーで使うなら...
-
CreateProcessでコンソールアプ...
-
「応答なし」の状態を監視する方法
-
VBを用いてログオフから自動で...
-
ASP.NET 2.0(VB)からEXCELオブ...
-
起動したIEのウインドウタイ...
-
shell関数について
-
_access関数が EACCES エラーと...
-
Javaのイベントリスナー機能の応用
-
CGIでinit.dで起動したプロセス...
-
CreateProcessでうまくexeファ...
おすすめ情報