web-dev-qa-db-ja.com

Mono Daemonのコーディング方法

Linux用のMono C#デーモンを作成しようとしています。

プロセスを強制終了するのではなく、処理が完了したときに開始と停止を実行したいと思います。

誰かこれの例がありますか?

編集:debianでstart-stop-daemon --backgroundを使用する方法を理解したので、今はそれを使用するだけだと思います。

編集:私はこれをJavaにも実装していますが、アプリの終了をキャッチするこの素敵なaddShutdownHookがあります。モノサービスの依存関係を整理するためにもう少し時間を費やす必要があります。アプリの終了をキャッチする方法。

SessionEndイベントがありますが、それはコンソールアプリではなくサービスでのみ使用できます

Answer:LinuxでWindowsサービスをラップするためにモノサービスを使用

52
Scott Cowan

サービスを実装し、モノサービスを使用する必要があります。そのためのグーグルとあなたはいくつかの例を見つけるでしょう。

19
lupus

シグナルを使用するUnixの方法で通知を受信するには、受信する予定の各シグナルに Mono.Unix.UnixSignal を使用し、次に配列の配列でUnixSignal.WaitAny()を呼び出します。シグナル。


通常、これは別のスレッドで行います。

25
miguel.de.icaza

単純な方法は、bindと同様に、(ローカル、高)ポートで待機し、管理クライアントからコマンドを受信することです。

よりUNIX風の方法は シグナルハンドラを登録するnixSignal を使用し、特定の信号を受信すると適切にシャットダウンすることです。警告と例については、 Mono FAQ、「Monoでシグナルハンドラーを使用できますか?」 を参照してください。

lupus が検出した mono-serviceServiceProcess インターフェースを使用したホスティングプロセスです。残念ながら、これにはMONO_DISABLE_SHM、Monoの一部の機能、特にクロスプロセスIPCシステムを無効にします。

16
David Schmitt

Linuxのデーモンは通常、killシグナルなどのシグナルをリッスンしますが、ソフトリスタート(構成の読み取り)などを実行できるようにするデーモンもあります。

通常、これには/etc/init.dディレクトリ内のスクリプトが付随し、このようなデーモンの起動と停止を制御します。通常、pidファイルは/ var/runの下に作成され、スクリプトがプロセスを迅速に識別するためのプロセスIDを保持します。

Monoをコーディングする場合でも、Monoプロセスとネイティブプロセス(Cで作成されたものなど)やスクリプトとの間に違いがないため、コーディングする環境をよく理解できます。

デイブ

4

代わりに、シェルスクリプトを使用します。モノアプリを起動し、アプリが(意図的または意図せずに)終了すると、アプリが設定した戻り信号を確認します。これを使用して、更新をコピー、再起動、または終了するようにスクリプトに指示できます。アプリがクラッシュしても信号が返されないため、スクリプトによってアプリが再起動され、コンソール出力の最後の数行が記載された電子メールが送信されます。

LinuxでのMONOを使用したWindowsに似たサービス開発? を参照してください。

0
FlappySocks

Miguel de Icazaは最近、新しい Mono C#インタラクティブシェル について、十分に簡単にデーモン化できるように書いています。 Miguelには フォローアップ記事 があり、インタラクティブシェルを他のC#アプリケーションに組み込む方法を示すソースコードがいくつかあります。それはあなたのデーモンの良い出発点として役立つかもしれません。

インタラクティブシェルにはMonoバージョン2.2が必要ですが、これはまだリリースされていません。ただし、コードは Monoのsvnリポジトリ で利用できます。

0
godbyk

Davidは正解です。サービスの停止はUNIXシグナルを介して行われるため、シグナルハンドラーを使用してサービスをキャッチする必要があります。

0
Ana Betts