1

私の Google 検索スキルが低すぎるようです。いくつかの質問に対する回答が見つかりませんでした:

C# サービスから ruby​​ タスクを呼び出します。レジストリから情報を取得したり、タスクを準備したりするためのサービスのいくつかのほかに、私は最終的に次のことを行います。

      m_mProcess.StartInfo = new ProcessStartInfo { FileName = Command, Arguments = Argument, WorkingDirectory = WorkDir, CreateNoWindow = true };
      m_mProcess.Start();
      Pid = m_mProcess.Id;

ファイル名は「ruby.exe」です。サービスを停止するときに、開始されたタスクに CTRL-SIGNAL-BREAK を送信できるようにするために、多くのことを試しました (詳細については、こちらを参照してください。これにより失敗します:サービスから EXE ファイルを開始し、送信して停止します) 。シグブレイク)。

したがって、今のところ、プロセスを停止するだけProcess.GetProcessById(Pid).Kill();です。

これにより、問題が 1 つだけ発生します。ruby タスクを使用してシンサーバーを起動し、tcp ポートを開いてリッスンします。プロセスを強制終了すると、設計上 2 ~ 3 分間、ポートが Windows によってブロックされます (正確な時間は不明で、この機能を無効にする方法がわかりませんでした)。

前編はここまで。今、私の実際の問題に:)。

rubyw.exe代わりにandを使用ruby.exeして、タスクと対話する方法を見つけることを考えていました。ポートをブロックすることなく、rubyw.exe タスクを正しくシャットダウン/停止できることを願っています。ruby.exe を使用する代わりに、サービスを ruby​​w.exe で開始するように変更して、副作用や問題をテストしました (まだ見つかりません)。しかし、プロセスを正しくシャットダウンする方法が見つかるまで、プロセスを強制終了する必要があります。

4

1 に答える 1

1

このような問題にはおそらくもっと精巧な解決策がありますが、システム環境変数を管理することで簡単に処理できます。そのため、スクリプトを開始するときに、変数に「running」という値を指定します。停止したい場合は、呼び出しプログラムが変数を「stop」に変更します。スクリプトは変数を監視し、「停止」を見つけた場合は適切に閉じ、終了する直前に値を「停止」に設定して、呼び出し元のプログラムがスクリプトが実際に停止したことを認識できるようにします。これは、どの環境でもどの言語でも機能するソリューションですが、もちろん、変更するには Rubyscript にアクセスする必要があります。

于 2012-08-08T07:40:52.717 に答える