3

Windows XP を搭載した古いコンピューターがシステムのサーバーとして機能している状況があり、何か問題が発生したときにアラームを送信する可能性があります。しかし、私たちが使用しているこのサーバー プログラムは非常にバグが多く、特定の瞬間にアラームを気にしなくなることがあります。これらのアラームは積み重なり、プログラムが最終的に再起動されると、すべてが一度に送信されます。これにより、これらのアラームはほとんど役に立たなくなります。プログラムを再起動するまでに、システムに問題があることがすでにわかっているからです。

私が目指している解決策は、単純なバッチ ファイルを使用して、Windows タスク スケジューラが毎晩プログラムを強制終了し、再起動できるようにすることです。ただし、プログラムのプロセスは Windows プロセス csrss.exe の子プロセスであるサブプロセスとして実行されているため、プロセスを強制終了する方法が見つからないようです。

タスクマネージャーを開くと、プロセスを表示して強制終了できますが、コマンドtasklistには親プロセスの csrss.exe しか表示されず、それを強制終了するには PID が必要taskkillです。はい、子プロセスも強制終了tasklistする追加のパラメーターがあります/tが、子プロセスのみを強制終了し、Windows csrss.exe の実行に明らかに不可欠なままにする方法が必要です。

私の質問は次のとおりです。バッチファイルを使用して子プロセスのみを強制終了する方法を知っている人はいますか?

これはもちろん、このための特定のプログラムをコーディングして、バッチ ファイルでそのプログラムを使用することによって実行できますが、迅速な修正を望んでいます。

これまでのところ、私は持っています:

TASKLIST /FI "IMAGENAME eq program.exe" 2>NUL | FIND /I /N "program.exe">NUL
IF NOT %ERRORLEVEL%==0 GOTO :restart
TASKKILL /FI "IMAGENAME eq program.exe" /F /T

:restart
START /D "C:\path\" program.exe

編集:

別のプロセスの子プロセスであるため、プロセスのイメージ名がタスク マネージャーでインデントされていないことに気付きましたが、16 ビット プロセスであるためです (直感的です)。つまり、これは 16 ビット プロセスであり、問​​題はどのようにして PID を見つけて 16 ビット プロセスを強制終了するかということです。Tasklist、私が述べたように、それは表示されておらず、どちらも表示されていませんpslist

4

1 に答える 1

1

私は自分の問題をなんとか解決したと思います。同様のことに遭遇する可能性のある人のために、これをここに残しておきます。

tasklistとによって「到達可能」であったため、代わりにプロセス ntvdm.exe を強制終了しようとしました。これはtaskkill、Google 検索で、16 ビット プログラムを 32 ビット システムで実行できる Windows の仮想マシンであることが明らかになったためです。最初に強制せずに強制終了しようとしましたが、16ビットプロセス自体ではなく、ntvdm.exeのみを強制終了しました。ただし、強制しても問題ないように見えましたが、複数の重要な 16 ビット プロセスが実行されている場所では、(明らかな理由から) このソリューションはお勧めしません。

最終的に使用したコマンドは次のとおりです。

TASKKILL /FI "IMAGENAME eq ntvdm.exe" /F /T
于 2012-11-02T15:51:06.493 に答える