問題タブ [daemon]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
php - PHPクライアントとCデーモンサーバー間でIPCを実行するにはどうすればよいですか?
質問を見てくれてありがとう。
背景
私は、非常に短い時間枠で複数(最大300)のPHPコンソールスクリプトを継続的に生成するいくつかのマシンを持っています。これらのスクリプトはすばやく(1秒未満)実行されてから終了します。これらのスクリプトはすべて、大きなトライ構造への読み取り専用アクセスが必要です。これは、各スクリプトが実行されるたびにメモリにロードするのに非常にコストがかかります。サーバーはLinuxを実行します。
私のソリューション
トライ構造をメモリに保持し、PHPクライアントからの要求を受信するCデーモンを作成します。すべてのPHPクライアントからリクエストを受け取り、メモリ構造のルックアップを実行して回答を返し、PHPスクリプトがその作業を行わないようにします。要求と応答はどちらも短い文字列(20文字以内)です
私の問題
は、Cデーモンとプロセス間通信に非常に慣れていないことです。多くの調査の結果、選択肢をメッセージキューとUnixドメインソケットに絞り込みました。メッセージキューは、デーモンがそれらにシリアルに応答するためのすべての要求をキューに入れると私が思うので(私は間違っているかもしれません)、適切であるように思われます。ただし、Unixドメインソケットの方が使いやすいようです。しかし、私は答えを見つけることができなかったさまざまな質問があります:
- PHPスクリプトはどのようにしてメッセージを送受信したり、UNIXソケットを使用してデーモンと通信したりできますか?逆に、CデーモンはどのPHPプロセスに応答を送信する必要があるかをどのように追跡しますか?
- 私が見たデーモンのほとんどの例では、内部にスリープ状態がある無限のwhileループを使用しています。私のデーモンは、いつでも接続できる多くの接続を処理する必要があり、応答の待ち時間が重要です。PHPスクリプトがスリープ中にリクエストを送信した場合、デーモンはどのように反応しますか?投票とepollについて読みましたが、これは受信したメッセージを待つ正しい方法ですか?
- 各PHPプロセスは、常に1つの要求を送信し、応答の受信を待機します。デーモンがダウンしている/使用できない場合、PHPプロセスは設定された最大時間応答を待機し、応答が受信されない場合はハングするのではなく続行することを確認する必要があります。これはできますか?
データ構造の実際のルックアップは非常に高速です。FIFO方式で要求を処理するだけで十分だと思うので、複雑なマルチスレッドや同様のソリューションは必要ありません。また、これはミッションクリティカルなサービスであり、このタイプのプログラムにはかなり慣れていないため、単純に愚かにする必要があります。(私は知っていますが、私はこれを回避する方法が本当にありません、そして学習経験は素晴らしいでしょう)
私が持っている特定の質問に光を当てるコードスニペットを本当にいただければ幸いです。低レベルのIPCのこの暗い世界への私の理解をさらに深めるガイドとポインタへのリンクも歓迎します。
ご協力いただきありがとうございます!
アップデート
この質問をしたときよりもはるかに多くのことを知っているので、ThriftフレームワークとZeroMQの両方がハードなソケットレベルのプログラミングを抽象化する素晴らしい仕事をしていることに興味のある人に指摘したいと思います。Thriftは、サーバーの足場を無料で提供します。
実際、ネットワークサーバーを構築するという大変な作業をすべて行うのではなく、問題をすでに解決している優れた非同期サーバーを使用してアプリケーションサーバーコードを作成することを検討してください。もちろん、非同期IOを使用するサーバーは、集中的なCPU処理(またはイベントループブロック)を必要としないネットワークアプリケーションに最適です。
Pythonの例:Twisted、gevent。私はgeventを好みますが、tornadoはHTTPサーバー側に焦点を合わせているため、含めません。
Rubyの例:EventMachine
もちろん、Node.jsは基本的に、今日の非同期サーバーのデフォルトの選択肢です。
さらに詳しく知りたい場合は、C10k問題とUnixネットワークプログラミングをお読みください。
ruby-on-rails - フレームワーク全体をロードせずに Ruby on Rails モデルをロードする
メールやユーザー通知の遅延など、さまざまなデータベース タスクを実行するカスタム デーモンを作成しようとしています (各通知は通知テーブルの個別の行です)。script/runner
これらのタスクを使用したり実行したりしたくありませんrake
。タスクによっては、1 つまたは 2 つのデータベース行または数千行の作成しか必要としないタスクもあるからです。Ruby プロセスを起動したり、操作ごとに Rails フレームワーク全体をロードしたりするオーバーヘッドは必要ありません。このデーモンを常にメモリに保持する予定です。
このデーモンを作成するには、Ruby on Rails アプリケーションのモデルを使用したいと考えています。モデルをどこで使用する場合にロードする必要があるかなど、多くの Rails プラグインacts_as_tree
があります。AASM
ロードする必要があるプラグインのいくつかは、私が作成した ActiveRecord::Base のカスタム ハックです。(レールの他の部分からのコンポーネントが必要な場合は、プラグインの一部の削除または再コーディングを喜んで受け入れます。)
私の質問は
- これは良い考えですか?
- そして - モデルとプラグインに各ファイルを手動で含める必要がない方法でこれを行うことは可能ですか?
良い考えでなければ
- 良い代替手段は何ですか?
(私は自分で SQL クエリを書くのは好きではありませんが、愚かな事故を防ぐために、データベースの制約とデーモン用の別のユーザーを追加する必要があります。データベースの構成に慣れていないので、アクティブ レコードを使用したいと思います。松葉杖として。)
php - PHPを真剣にスピードアップしますか?
私は何年もPHPを作成していて、太陽の下ですべてのフレームワークを使用してきましたが、常に1つのことが私を悩ませてきました...そして、誰かが私のサーバーに欲しいと言うたびに、血まみれのこと全体を解釈して実行する必要がありますページが提供されました。
キャッシング、FastCGI、Zend Job Queue(および同様の機能を備えたsymfonyプラグイン、およびバックグラウンドプロセスを実行するためにSystem_Daemonクラスを実装する独自のDBベースのソリューション)を試し、なんとか作成できました。アプリはそれらすべてをかなり速く使用します...しかし、設定ファイル、システム/環境チェック機能、および実際に一度だけロードする必要があるすべてのもの...誰かが毎回ロードするという精神的なブロックを乗り越えることはできません私のページにヒットします。
だから、私のランブルは次のQにつながります--
PHPの特定の側面をRAMにロードして、そのページが要求されたときに、すべてのsettings.ymlファイル、システムチェック、フレームワークファイル、キャッシュされたページなどを、HDに触れることなくメモリから直接ロードできるようにする方法/手法はありますか? ...または、プログラムを開始するために1日に50,000回同じ読み込みメカニズムを実行する必要がありますか?
PHPに何もない場合、真のinit-onceアプリを可能にするために、この方法でコンパイルできる他の「Web」言語はありますか?
java - Java ロケーションで記述された Linux デーモン
私は現在Javaデーモンを書いています。標準のデーモン コマンド (開始、停止、再起動、ステータス) を持つスクリプトを作成しており、デーモンをインストールするときにどこに行くべきかを決定しようとしています。
私の現在のアイデアは次のとおりです。
PID ファイル: /var/run/myapp.pid
デーモン スクリプト: /etc/init.d/myapp
Java アプリ (.jar): /usr/bin/myapp
ログ: /var/log/myapp.err、/var/log/myapp.log、/var/log/myapp.info (お分かりでしょう)
構成: /etc/myapp.conf (複数ある場合は/etc/myapp/configs-go-here将来)
私はまだ Linux ディレクトリ構造に慣れていないので、何か間違ったことをしている場合はお知らせください。私を最も混乱させているのは、私の Java アプリがバイナリではなく .jar ファイル (アーカイブ) であることです。/usr/bin/は「適切な」場所ではないということですか?
java - Reference クラスを使用すると、どのようなオーバーヘッドが発生しますか?
次のような Reference クラスを使用して参照オブジェクトを作成するたびに、デーモン スレッドが実行されていることがわかりました。
また、階層的なスレッド構造がある場合、各レベルで追加のデーモン スレッドが開始されます。
objective-c - Objective Cでデーモンを書く
オブジェクティブ c を使用して、os x の Windows サービスと同じように、デーモンを作成する必要があります。誰かがいくつかのサンプルを指摘できますか? またはこれを行う方法について教えてください。
macos - Objective Cでデーモンを書く
オブジェクティブ c を使用して、os x の Windows サービスと同じように、デーモンを作成する必要があります。誰かがいくつかのサンプルを指摘できますか? またはこれを行う方法について教えてください。
python - Python(バックグラウンドのデーモン)を使用してキーが押されたかどうかを確認します
キーボードの Super (または WinKey) を押すたびにイベントを実行する必要がある Python スクリプトを作成しました。
イベントを実行するためにキーが押されるのを待っているバックグラウンドで実行されているため、Pythonプロセスが「フォーカス」されずにこれを達成するにはどうすればよいですか?
入力を読み取る方法を示すWeb上の投稿をたくさん見ましたが、それらはすべてプロセスを「集中」させる必要があり、Pythonスクリプトを使用してスーパー(またはWinKey)をキャプチャする方法を示したものはありません。
Ubuntu 9.10 を実行しています。
java - Java デーモン - シャットダウン要求の処理
私は現在、多くの異なるタスクを実行するデーモンに取り組んでいます。マルチスレッドであり、クラッシュすることなく、ほぼすべての種類の内部エラーを処理するように構築されています。さて、シャットダウン要求を処理するところまで来ましたが、どうすればよいかわかりません。
私はシャットダウンフックをセットアップしており、それが呼び出されると、メインデーモンループに実行を停止するように指示する変数を設定します。問題は、このデーモンが複数のスレッドを生成し、長い時間がかかることです。たとえば、これらのスレッドの 1 つがドキュメントを変換している可能性があります。それらのほとんどは高速ですが (10 秒未満だと思います)、10 分以上続くスレッドもあります。
私が今考えているのは、シャットダウン フックが送信されたとき、500 ミリ秒 (またはそれくらい) のスリープ (これらのスレッドはすべて ThreadGroup 内にあります) で ThreadGroup.activeCount() で 5 秒ほどループを実行することです。このループで、シャットダウン要求が呼び出されたことを知らせる通知をすべてのスレッドに送信します。次に、クリーンアップとシャットダウンを行っていることに関係なく、即座に実行する必要があります。
他に何か提案はありますか?たとえばMySQLのようなデーモンが停止するように言われたときに何をするかに興味があります。それは即座に停止します。非常に遅い 10 個のクエリが呼び出されている場合はどうなりますか? それは待つか、それとも単にそれらを終了しますか。つまり、サーバーは非常に高速なので、1 秒以内に実行できない操作はありません。現在、1000ミリ秒で多くのことができます。
ありがとう
unix - MacOSでシステム全体のデーモンをロードする方法
このコマンドを使用してdaemon-appをロードしようとしていますlaunchctl load /Library/LaunchDaemons/myPlistFileName
。正常に動作しますが、ユーザーがシステムにログインしている間のみです。
ユーザーがシステムにログインしていなくてもロードされたままになるdeamon-appをロードするにはどうすればよいですか(windows-servicesなど)??
コマンドsudo launchctl load /Library/LaunchDaemons/myPlistFileName
は私にエラーを与えます->ロードするものが見つかりません
これを行う正しい方法はどれですか?
編集:私のPlist-ファイル
現在はそうです:system-startで、私のデーモンはroot-permissionsで始まります。ユーザーアカウントでログインした後、daemon-processが再起動し、ユーザーがプロセスの新しい所有者になります