3

私たちのグループには、毎日実行される長期実行プロセスがあります。プロセスは通常、特定の日の午後 9 時に開始され、翌日の午後 7 時まで実行されます。したがって、通常は 1 日 22 時間稼働します。それらは、特定の汎用ユーザー ID の下でサーバー上のスケジュールされたタスクによって開始され、そのユーザー ID がログオンしているかどうかに関係なく開始および実行されます。したがって、これらはウィンドウのないコンソール実行可能ファイルです。

タスクは、大規模なサーバー ファームで実行される計算を調整します。一般に、これらの制御タスクは 1 日 22 時間中断することなく実行されます。ただし、これらのプロセスを停止して再起動する必要があることがよくあります。それらはサーバー ファームで実行されている多数のタスクを制御するため、すべてのサーバー ファーム プロセスを停止およびシャットダウンできるように、それらを完全にシャットダウンすることが重要です。それは私たちの問題に私をもたらします。

制御プロセスは、ctrl-C および ctrl-break シグナルに応答するようにプログラムされています。これは、コンソールにアクセスできるコンソールでプロセスが手動で開始され、コンソール ウィンドウで ctrl-c または ctrl-break を「入力」できる場合に正常に機能します。ただし、前述のように、プロセスは通常、ウィンドウのないスケジュールされたタスクとして実行されます。したがって、存在しないコンソール ウィンドウに何かを「入力」することはできません。これらはログオン プロセスなしで実行されるコンソール プロセスであるため、完全にウィンドウのない環境でも実行できる必要があります。では、シャットダウン シグナルをリッスンするプロセスをどのように設定すればよいでしょうか。

プロセスは確かに ctrl-C および ctrl-break シグナルをリッスンしますが、そのシグナルをプロセスに送信する方法がわかりません。これは Windows の根本的な問題のようですが、間違っていますか? 私は SendSignal.exe を認識していますが、これまでのところ動作させることができませんでした。次のように失敗します。

>SendSignal 26320
Sending signal to process 26320...
CreateRemoteThread failed with 0x00000005.
StartRemoteThread failed with 0x00000005.
0x00000005 == Access is denied.

-F なしで「タスクキル」を試みると、次のようになります。

>taskkill /PID 24840
ERROR: The process with PID 24840 could not be terminated.
Reason: This process can only be terminated forcefully (with /F option). 

他のすべての「kill」関数は、シグナルを送信するのではなく、すぐにプロセスを kill します。

考えられる解決策の 1 つは、ファイル監視ベースの解決策です。特定のファイルの変更を監視する監視を作成します。しかし、これはハックであり、適切なシグナリングで行うことをお勧めします。誰かがこの問題を解決しましたか? 非常に基本的な機能のようで、Unix 環境で実行するのは確かに簡単です。マイクロソフトは、ウィンドウレス実行可能ファイルを完全にシャットダウンできるメカニズムを提供しているのでしょうか?

私は以下のスレッドを認識していますが、その質問は実質的に同じです (回答が必要な理由、つまり、ウィンドウなし、コンソールなしのプロセスでこれを実行できるようにする必要がある理由の仕様を除いて) が、回答はありません。私が言ったように、私たちにとってはうまくいかない「use SendSignal」を除いて:

Windows 上のアプリケーションに ctrl-C (SIGINT) を送信できますか?

他にも同様の質問がありますが、まだ回答がありません。

どんな助けでも感謝します。

4

1 に答える 1